tokio-thrift-codegen 0.1.0

code generation library of tokio-thrift
Documentation
#[allow(dead_code, non_snake_case, non_camel_case_types)]
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct {{exception.ident}} {
    {{~#each exception.fields as |field|}}
    {{#if field.optional ~}}
    #[allow(dead_code, non_snake_case)]
    pub {{field.ident}}: Option<{{to_rust field.ty}}>,
    {{~^~}}
    #[allow(dead_code, non_snake_case)]
    pub {{field.ident}}: {{to_rust field.ty}},
    {{~/if~}}
    {{~/each}}
}

impl  Display for {{exception.ident}} {
    fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
        write!(f, "{:?}", self)
    }
}

impl Error for {{exception.ident}} {
    fn fn description(&self) -> &str {
        "Thrift defined exception"
    }
}

impl ::tokio_thrift::protocol::Serialize for {{exception.ident}} {
    fn serialize<S>(&self, s: &mut S) -> Result<(), ::tokio_thrift::protocol::Error>
        where S: ::tokio_thrift::protocol::Serializer + ::tokio_thrift::protocol::ThriftSerializer
    {
        s.write_struct_begin("{{exception.ident}}")?;
        {{#each exception.fields as |field|~}}
        {{#if field.optional}}
        if self.{{field.ident}}.is_some() {
            s.write_field_begin("{{field.ident}}", {{to_protocol field.ty}}, {{field.seq}})?;
            self.{{field.ident}}.unwrap().serialize(s)?;
            s.write_field_end()?;
        }
        {{~^~}}
        s.write_field_begin("{{field.ident}}", {{to_protocol field.ty}}, {{field.seq}})?;
        self.{{field.ident}}.serialize(s)?;
        try!(s.write_field_end());
        {{~/if~}}
        {{~/each}}
        s.write_field_stop()?;
        s.write_struct_end()?;
        Ok(())
    }
}


impl ::tokio_thrift::protocol::Deserialize for {{exception.ident}} {
    fn deserialize<D>(de: &mut D) -> Result<Self, ::tokio_thrift::protocol::Error>
        where D: ::tokio_thrift::protocol::Deserializer + ::tokio_thrift::protocol::ThriftDeserializer,
    {
        de.read_struct_begin()?;
        {{~#each exception.fields as |field|}}
        let mut {{field.ident}} = None;
        {{~/each}}
        loop {
            let scheme_field = de.read_field_begin()?;
            if scheme_field.ty == ::tokio_thrift::protocol::ThriftType::Stop {
                break;
            };
            match scheme_field.seq {
                {{~#each exception.fields as |field|}}
                {{field.seq}} => {
                    if scheme_field.ty == {{to_protocol field.ty}} {
                        {{field.ident}} = Some({{expr field.ty}}?);
                    } else {
                        // skip
                    }
                },
                {{~/each}}
                _ => (),// skip
            }
            de.read_field_end()?;
        };
        de.read_struct_end()?;
        let args = {{exception.ident}} {
            {{~#each exception.fields as |field|}}
            {{#if field.optional ~}}
            {{field.ident}}: {{field.ident}},
            {{~^~}}
            {{field.ident}}: {{field.ident}}.unwrap(),
            {{~/if~}}
            {{~/each}}
        };
        Ok(args)
    }
}