
{% for item in td.uses %}use {{item}};
{% endfor %}

{% if td.comment %}{{td.comment}}{% endif %}
#[derive(Debug, Clone)]
pub struct {{td.typen}} {
  inner: {{td.inner}}
}

impl RObject for {{td.typen}} {
  fn td_name(&self) -> &'static str {
    self.inner.td_name()
  }

  fn td_type(&self) -> RTDType {
    self.inner.td_type()
  }

  fn to_json(&self) -> String {
    self.inner.to_json()
  }
}

impl Serialize for {{td.typen}} {
  fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
    self.inner.serialize(serializer)
  }
}

impl<'de> Deserialize<'de> for {{td.typen}} {
  fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de> {
    {{td.inner}}::deserialize(deserializer).map(|inner| {{td.typen}}::new(inner))
  }
}

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

  pub fn from_json<S: AsRef<str>>(json: S) -> Option<{{td.typen}}> {
    {{td.inner}}::from_json(json).map(|inner| {{td.typen}}::new(inner))
  }

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

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