You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 != _|_)
    }
}

测试验证

合法场景

  1. 仅设置weekday_time_of_day:
rotations: {
    time_restrictions: {
        weekday_time_of_day: ["09:00-17:00"]
    }
}
  1. 仅设置time_of_day:
rotations: {
    time_restrictions: {
        time_of_day: ["08:00-18:00"]
    }
}

以上两种场景均可通过校验。

非法场景

  1. 同时设置两个字段:
rotations: {
    time_restrictions: {
        weekday_time_of_day: ["09:00-17:00"]
        time_of_day: ["08:00-18:00"]
    }
}

Cue会抛出校验错误,提示其中一个字段必须为未初始化状态。

  1. 两个字段都不设置(仅针对进阶方案):
rotations: {
    time_restrictions: {}
}

会触发逻辑或约束的错误,要求必须设置其中一个字段。

说明

这种条件判断的方式不受字段类型限制,不管weekday_time_of_day和time_of_day是简单数组还是复杂结构体,都能生效。你之前尝试的OneOf模式如果是指枚举类的oneof关键字,它更适用于字段值的枚举选择,而这里的字段互斥校验用条件约束更直接。

内容的提问来源于stack exchange,提问作者deepbrook

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:40:25