rocket_codegen 0.2.10

Code generation for the Rocket web framework.
use syntax::ast::*;
use syntax::codemap::{Span, Spanned};
use syntax::ext::base::Annotatable;
use utils::{ArgExt, span};

#[derive(Debug)]
pub struct Function(Spanned<(Ident, FnDecl)>);

impl Function {
    pub fn from(annotated: &Annotatable) -> Result<Function, Span> {
        let inner = match *annotated {
            Annotatable::Item(ref item) => match item.node {
                ItemKind::Fn(ref decl, ..) => {
                    span((item.ident, decl.clone().unwrap()), item.span)
                }
                _ => return Err(item.span)
            },
            Annotatable::TraitItem(ref item) => return Err(item.span),
            Annotatable::ImplItem(ref item) => return Err(item.span),
        };

        Ok(Function(inner))
    }

    pub fn ident(&self) -> &Ident {
        &self.0.node.0
    }

    pub fn decl(&self) -> &FnDecl {
        &self.0.node.1
    }

    pub fn span(&self) -> Span {
        self.0.span
    }

    pub fn find_input<'a>(&'a self, name: &Name) -> Option<&'a Arg> {
        self.decl().inputs.iter().find(|arg| arg.named(name))
    }
}