
#[doc(hidden)] pub struct _TG{{td.clz_name}}Builder { inner: TG{{td.clz_name}} }

impl _TG{{td.clz_name}}Builder {

  pub fn build(&self) -> TG{{td.clz_name}} { self.inner.clone() }

  {% for field in td.fields %}{% if field.native %}{% if field.name != 'td_name' %}{% if field.description %}/// {{field.description}}{% endif %}
  pub fn {{field.name}}{% if field.class_real == 'String' %}<S: AsRef<str>>{% endif %}(&mut self, {{field.name}}: {% if field.class_real == 'String' %}S{% else %}{{field.class_real}}{% endif %}) -> &mut Self {
    self.inner.td_origin_mut()._set_{{field.name}}({% if field.class_real == 'String' %}{{field.name}}.as_ref().to_string(){% else %}{{field.name}}{% endif %});
    self
  }
  {% endif %}{% endif %}{% endfor %}

  {% for field in td.fields %}{% if not field.native %}{% if field.name != 'td_name' %}
  // [{{field.name}}] type is [{{field.class_real}}], is not support, need add manully.
  #[doc(hidden)] pub fn _{{field.name}}(&mut self, {{field.name}}: {{field.class_real}}) -> &mut Self {
    self.inner.td_origin_mut()._set_{{field.name}}({{field.name}});
    self
  }
  {% endif %}{% endif %}{% endfor %}
}


{% if td.clz_description %}/// {{td.clz_description}}{% endif %}
#[derive(Debug, Clone)]
pub struct TG{{td.clz_name}} {
  inner: {{td.clz_name}}
}

impl TDFB for TG{{td.clz_name}} {}

impl AsRef<TG{{td.clz_name}}> for TG{{td.clz_name}} {
  fn as_ref(&self) -> &TG{{td.clz_name}} { self }
}

impl AsRef<TG{{td.clz_name}}> for _TG{{td.clz_name}}Builder {
  fn as_ref(&self) -> &TG{{td.clz_name}} { &self.inner }
}

impl TG{{td.clz_name}} {

  pub fn builder() -> _TG{{td.clz_name}}Builder {
    _TG{{td.clz_name}}Builder { inner: Self::new({{td.clz_name}}::_new()) }
  }

  pub fn new(inner: {{td.clz_name}}) -> Self {
    Self { inner }
  }

  pub fn td_origin(&self) -> &{{td.clz_name}} { &self.inner }

  pub fn td_origin_mut(&mut self) -> &mut {{td.clz_name}} { &mut self.inner }

}
