cloudwu / sproto

Yet another protocol library like google protocol buffers , but simple and fast.
MIT License
942 stars 253 forks source link

support weak type for sproto #97

Closed t0350 closed 3 years ago

t0350 commented 3 years ago

增加了 SPROTO_WEAK_TYPE 宏,希望能在 sproto 中支持弱类型开启与否,放松类型校验。

起因是项目组中出现把 number 值赋值给了 sproto integer 类型,导致报错。测试时未能暴露,出错的时候已经是在线上环境,造成影响比较大。

如果单纯直接放松检查,我觉得不太可取。结合 lua 的几个 api 考虑了下,增加宏开关使得 sproto 放松类型校验。 原来的情况是这样的:

  1. sproto integer 仅接受 lua integer。
  2. sproto boolean 仅接受 lua boolean。
  3. sproto string 可接受 string 值或任何可转为 string 的值。(不知道这里是否故意还是原来实现有问题,number 值也可以正常 encode)

开启 SPROTO_WEAK_TYPE 宏后,行为同 lua_toxxx 一致:

  1. sproto integer 可接受 lua integer 或 lua number。
  2. sproto boolean 为 false 仅当 lua 值为 false 或 nil。
  3. sproto string 可接受 string 值或任何可转为 string 的值。(同时对于宏未开启时,改为仅接受 string 值。)

麻烦云风看一下,或者看是否有其他建议。谢谢。

cloudwu commented 3 years ago

没什么问题,但我觉得如果要放宽的话,应该用 luaL_tolstring 更好。这个能触发元方法。另外 lua 5.4 已经是借助元方法来支持 string number 互转了。

t0350 commented 3 years ago

@cloudwu 已经修改过来。在弱类型模式下,sproto string 也支持传递带 __tostring 方法的 table。

cloudfreexiao commented 3 years ago

@t0350 可以 帮忙 提个 pr 到 skynet 不?

t0350 commented 3 years ago

好的 = = 。我提一下。