@0xe4b927d74c41a61e;

struct Map(Value) {
  entries @0 :List(Entry);
  struct Entry {
    key @0 :Text;
    value @1 :Value;
    bound @2 :Bool = false; # 本属性是否包含绑定
    isEvent @3 :Bool = false; # 本属性是否是事件类: click, doubleclick...
    media @4 :UInt16; # 引用的 media query id，已废弃
    boundType @5 :UInt16; # 0:正常待绑定数据源 1:native侧待绑定环境数据源[falcon_env()格式]
    plurals @6 :List(Text);
  }
}

struct ForAttr {
  item @0 :Text;
  index @1 :Text;
  items @2 :Text;
}

struct QueryCondition {
  modifier @0 :Text;
  feature @1 :Text;
  value @2 :Text;
}

struct QueryClause {
   inverse @0 :Bool;
   type @1 :Text;
   expressions @2 :List(QueryCondition);
}

struct Query {
  clause @0 :List(QueryClause); # 查询条件
  style @1 :Map(Map(Text)); # 应用样式
}

struct Node {
  tag @0 :Text;
  attributes @1 :Map(Text);
  children @2 :List(Node);
  text @3 :Text; # 直接内容，比如 text 元素的直接内容
  textBound @4 :Bool = false; # text 属性中是否有绑定
  inlineStyle @5 :Map(Text); # 直接内联样式，包含数据绑定的样式在 attributes 里，两者仅存其一
  vIf @6 :Text; # v-if 属性(注：同时支持 has? 和 get 操作)
  vElse @7 :Bool; # 是否包含 v-else 属性
  vElseIf @8 :Text; # v-else-if 属性
  vShow @9 :Text; # v-show 属性
  vfor @10 :ForAttr; # v-for 属性
  textBoundType @11 :UInt16; # 0:正常待绑定数据源 1:native侧待绑定环境数据源[falcon_env()格式]
  hasI18n @12 :Bool = false;
  vIfType @13 :UInt16 = 0;  # 0:正常待绑定数据源 1:native侧待绑定环境数据源[falcon_env()格式]
  vElseIfType @14 :UInt16 = 0;
  vforType @15 :UInt16 = 0;
  vShowType @16 :UInt16 = 0;
  nid @17 :Text; # 节点唯一标识，单模板纬度保持唯一
}

struct Template {
  meta @0 :Text; # 比如，要求的引擎版本，供能力协商/版本兼容
  struct @1 :Node; # 结构
  style @2 :Map(Map(Text)); # 样式
  binding @3 :Text; # 特殊绑定逻辑
  logic @4 :Text; # 业务逻辑，留未来扩展
  compilerVersion @5 :Text; # 模板经由什么版本编译器打包
  medias @6 :List(Query); # 所有的 media query 定义
  i18nPhrases @7 :Map(Map(Text)); # 国际化语言翻译
  compilerType @8 :UInt16 = 0; # 0（一期编译器类型）1（二期支持JS编译器类型）
}
