syntax = "proto3";

package device.proto.model.common.schema;
option csharp_namespace = "Al.Proto.Model.Common.Schema";

//枚举值
message EnumValue {
    //枚举值
    int64 value = 1;
    //对应的串字面值
    string text = 2;
    //备注信息
    string remark = 3;
}

//类型元描述
message TypeAttribute {
    //类型分类
    enum Category {
        //类型分类：未知
        UNKNOWN = 0;
        //类型分类：布尔
        BOOLEAN = 1;
        //类型分类：有符号8位整数
        INT8 = 2;
        //类型分类：无符号8位整数
        UINT8 = 3;
        //类型分类：有符号16位整数
        INT16 = 4;
        //类型分类：无符号16位整数
        UINT16 = 5;
        //类型分类：有符号32位整数
        INT32 = 6;
        //类型分类：无符号32位整数
        UINT32 = 7;
        //类型分类：有符号64位整数
        INT64 = 8;
        //类型分类：无符号64位整数
        UINT64 = 9;
        //类型分类：小数
        FLOAT = 10;
        //类型分类：字符串
        STRING = 15;
        //类型分类：枚举值
        ENUM = 20;
        //类型分类：数组/集合
        ARRAY = 25;
        //类型分类：键值对
        MAP = 26;
        //类型分类：变体
        VARIANT = 29;
        //类型分类：对象
        OBJECT = 30;
    }

    //初始值
    message InitialValue {
        oneof kind_of_initial {
            //浮点小数值
            double floating = 1;
            //整数值
            uint64 integer = 2;
            //文本值
            string text = 3;
            //枚举值
            EnumValue enum_value = 4;
            //布尔值
            bool boolean = 5;
        }
    }

    //可选值
    message OptionValue {
        oneof kind_of_value {
            //浮点小数值
            double floating = 1;
            //整数值
            uint64 integer = 2;
            //文本值
            string text = 3;
            //枚举值
            EnumValue enum_value = 4;
        }
    }

    //类型定义
    string definition = 1;
    //类型分类
    Category category = 2;
    //概要备注信息
    string remark = 3;

    //默认初始值
    InitialValue initial = 4;

    //依赖的类型定义
    repeated string dependencies = 5;

    //详细备注信息
    string note = 6;

    //是否必要/必填
    bool necessary = 11;
    //是否只读
    bool readonly = 13;
    //匹配信息
    string pattern = 15;

    oneof kind_of_range_min {
        //最小整数
        int64 min_integer_value = 17;
        //最小浮点数
        double min_float_value = 18;
    }
    oneof kind_of_range_max {
        //最大整数
        uint64 max_integer_value = 19;
        //最大浮点数
        double max_float_value = 20;
    }

    //是否可扩展，仅针对枚举类型
    bool extendable = 21;

    //可选值
    repeated OptionValue options = 22;

    //装饰属性信息
    map<string, string> decorators = 23;
}

//类型信息
message TypeSchema {
    //类型属性
    TypeAttribute attr = 1;
    //字段集合
    map<string, TypeAttribute> fields = 4;
}
