ice_core 0.5.1

High performance Web engine
use wasm_core::executor::{NativeResolver, NativeEntry};
use super::app::ApplicationImpl;
use std::rc::Weak;
use std::collections::BTreeMap;
use super::namespace::Namespace;

pub struct LssaResolver {
    app: Weak<ApplicationImpl>,
    namespaces: BTreeMap<String, Box<Namespace>>
}

impl NativeResolver for LssaResolver {
    fn resolve(&self, module: &str, field: &str) -> Option<NativeEntry> {
        dinfo!(logger!("resolve"), "Resolve: {} {}", module, field);
        if module != "env" {
            return None;
        }

        match field {
            _ => {
                let full_path = match field.split("__ice_").nth(1) {
                    Some(v) => v,
                    None => return None
                };
                let mut parts = full_path.splitn(2, '_');
                let ns_name = match parts.next() {
                    Some(v) => v,
                    None => return None
                };
                let field_name = match parts.next() {
                    Some(v) => v,
                    None => return None
                };
                let ns = match self.namespaces.get(ns_name) {
                    Some(v) => v,
                    None => return None
                };
                ns.dispatch(field_name)
            }
        }
    }
}

impl LssaResolver {
    pub fn new(app: Weak<ApplicationImpl>) -> LssaResolver {
        LssaResolver {
            app: app,
            namespaces: BTreeMap::new()
        }
    }

    pub fn add_namespace<T: Namespace>(&mut self, ns: T) {
        let prefix = ns.prefix().to_string();
        self.namespaces.insert(prefix, Box::new(ns));
    }

    pub fn init_default_namespaces(&mut self) {
        use super::ns;
        let app = self.app.clone();

        self.add_namespace(ns::timer::TimerNs::new(
            ns::timer::TimerImpl,
            app.clone()
        ));
        self.add_namespace(ns::logging::LoggingNs::new(
            ns::logging::LoggingImpl,
            app.clone()
        ));
        self.add_namespace(ns::tcp::TcpNs::new(
            ns::tcp::TcpImpl::new(),
            app.clone()
        ));
        self.add_namespace(ns::file::FileNs::new(
            ns::file::FileImpl::new(),
            app.clone()
        ));
    }
}