rustless 0.10.0

Rustless is a REST-like API micro-framework for Rust.
Documentation
use valico::json_schema;
use typemap;

use super::super::framework;

pub struct SchemesScope;

impl typemap::Key for SchemesScope {
    type Value = json_schema::Scope;
}

fn build_schemes(handlers: &mut framework::ApiHandlers, scope: &mut json_schema::Scope) -> Result<(), json_schema::SchemaError> {
    for handler_ in handlers.iter_mut() {
        let mut handler = &mut **handler_ as &mut framework::ApiHandler;
        if handler.is::<framework::Api>() {
            let api = handler.downcast_mut::<framework::Api>().unwrap();
            try!(build_schemes(&mut api.handlers, scope))
        } else if handler.is::<framework::Namespace>() {
            let namespace = handler.downcast_mut::<framework::Namespace>().unwrap();
            if namespace.coercer.is_some() {
                let coercer = namespace.coercer.as_mut().unwrap();
                try!(coercer.build_schemes(scope));
            }
            try!(build_schemes(&mut namespace.handlers, scope));
        } else if handler.is::<framework::Endpoint>() {
            let endpoint = handler.downcast_mut::<framework::Endpoint>().unwrap();
            if endpoint.coercer.is_some() {
                let coercer = endpoint.coercer.as_mut().unwrap();
                try!(coercer.build_schemes(scope));
            }
        }
    }

    Ok(())
}

pub fn enable_schemes(app: &mut framework::Application, mut scope: json_schema::Scope) -> Result<(), json_schema::SchemaError> {
    try!(build_schemes(&mut app.root_api.handlers, &mut scope));
    app.ext.insert::<SchemesScope>(scope);
    Ok(())
}