codeviz_java 0.2.2

Flexible code generator for Rust
Documentation
use super::*;

#[derive(Debug, Clone)]
pub struct FieldSpec {
    pub modifiers: Modifiers,
    pub ty: Type,
    pub name: String,
    pub annotations: Vec<AnnotationSpec>,
    pub initialize: Option<Statement>,
}

impl FieldSpec {
    pub fn new<I>(modifiers: Modifiers, ty: I, name: &str) -> FieldSpec
    where
        I: Into<Type>,
    {
        FieldSpec {
            modifiers: modifiers,
            ty: ty.into(),
            name: name.to_owned(),
            annotations: Vec::new(),
            initialize: None,
        }
    }

    pub fn push_annotation<A>(&mut self, annotation: A)
    where
        A: Into<AnnotationSpec>,
    {
        self.annotations.push(annotation.into());
    }

    pub fn initialize<S>(&mut self, initialize: S)
    where
        S: Into<Statement>,
    {
        self.initialize = Some(initialize.into());
    }
}

impl<'a, T> From<&'a T> for FieldSpec
where
    T: Into<FieldSpec> + Clone,
{
    fn from(value: &'a T) -> FieldSpec {
        value.clone().into()
    }
}

impl From<FieldSpec> for Variable {
    fn from(value: FieldSpec) -> Variable {
        Variable::Literal(value.name)
    }
}

impl From<FieldSpec> for Statement {
    fn from(value: FieldSpec) -> Statement {
        let mut elements = Elements::new();

        for a in value.annotations {
            elements.push(a);
        }

        let mut s = Statement::new();

        if !value.modifiers.is_empty() {
            s.push(value.modifiers);
            s.push(" ");
        }

        s.push(value.ty);
        s.push(" ");
        s.push(value.name);

        if let Some(initialize) = value.initialize {
            s.push(" = ");
            s.push(initialize);
        }

        elements.push(s);

        let mut out = Statement::new();
        let element: Element = elements.into();
        out.push(element);
        out
    }
}