如何在CueLang中声明结构体的两个字段为互斥以校验YAML?
实现Cue中互斥字段的二选一校验
要限制rotations.time_restrictions下的weekday_time_of_day和time_of_day仅能设置其中一个,不能同时存在,可以通过Cue的条件判断规则实现,以下是具体方案:
基础方案:禁止同时设置两个字段(允许都不设)
定义结构体时,通过条件约束确保当其中一个字段被设置时,另一个必须处于未初始化状态(_|_):
rotations: { time_restrictions: { // 定义字段类型,替换为你实际的复杂结构体即可 weekday_time_of_day?: []string time_of_day?: []string // 核心互斥规则 if weekday_time_of_day != _|_ { time_of_day: _|_ } if time_of_day != _|_ { weekday_time_of_day: _|_ } } }
进阶方案:必须设置其中一个(二选一必填)
如果要求两个字段必须设置其一,不能都不填,在基础方案上增加一条逻辑或约束:
rotations: { time_restrictions: { weekday_time_of_day?: []string time_of_day?: []string // 互斥规则 if weekday_time_of_day != _|_ { time_of_day: _|_ } if time_of_day != _|_ { weekday_time_of_day: _|_ } // 必须设置其一的约束 (weekday_time_of_day != _|_) || (time_of_day != _|_) } }
测试验证
合法场景
- 仅设置
weekday_time_of_day:
rotations: { time_restrictions: { weekday_time_of_day: ["09:00-17:00"] } }
- 仅设置
time_of_day:
rotations: { time_restrictions: { time_of_day: ["08:00-18:00"] } }
以上两种场景均可通过校验。
非法场景
- 同时设置两个字段:
rotations: { time_restrictions: { weekday_time_of_day: ["09:00-17:00"] time_of_day: ["08:00-18:00"] } }
Cue会抛出校验错误,提示其中一个字段必须为未初始化状态。
- 两个字段都不设置(仅针对进阶方案):
rotations: { time_restrictions: {} }
会触发逻辑或约束的错误,要求必须设置其中一个字段。
说明
这种条件判断的方式不受字段类型限制,不管weekday_time_of_day和time_of_day是简单数组还是复杂结构体,都能生效。你之前尝试的OneOf模式如果是指枚举类的oneof关键字,它更适用于字段值的枚举选择,而这里的字段互斥校验用条件约束更直接。
内容的提问来源于stack exchange,提问作者deepbrook
相关产品推荐
相关产品推荐

