FPS 0.0.3

Flow processing system (under construction).
use syntax::ast::TokenTree;
use syntax::ast::Delimited;
use syntax::parse::token::Lit;
use syntax::parse::token::Token;
use syntax::parse::token::BinOpToken;
use syntax::parse::token::IdentStyle;

use syntax::parse::token::DelimToken;
use syntax::parse::token::intern;
use syntax::ast;
use syntax::codemap::DUMMY_SP;
use std::rc::Rc;

pub fn build_millefeuille_ffi_map(input: &[(ast::Ident,ast::Ident)]) -> ast::MacroDef {
	let mut match_body = vec![];
                    
    for &(modname,fname) in input {
    	let compound = format!(
        	"{}::{}",
        	&modname.name.as_str(),
        	&fname.name.as_str(),
        );
    	match_body.push(
			TokenTree::Token(DUMMY_SP, 
    			Token::Literal(
    				Lit::Str_(
    					intern(
    						&*compound
    					)
    				),
    				None
    			)
    		),
    	);
    	match_body.push(
			TokenTree::Token(DUMMY_SP, Token::FatArrow),
    	);
    	match_body.push(
			TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("Some")), IdentStyle::Plain)),
    	);
    	match_body.push(
			TokenTree::Delimited(DUMMY_SP, Rc::new(Delimited {
					delim: DelimToken::Paren,
        	        open_span: DUMMY_SP,
        	        close_span: DUMMY_SP,
        	        tts: vec![
        	        	TokenTree::Token(DUMMY_SP, Token::Ident(modname, IdentStyle::Plain)),
        	        	TokenTree::Token(DUMMY_SP, Token::ModSep),
        	        	TokenTree::Token(DUMMY_SP, Token::Ident(fname, IdentStyle::Plain)),
        	        ],
        	    })
        	)
    	);
    	match_body.push(
			TokenTree::Token(DUMMY_SP, Token::Comma),
    	);
    }
    
    match_body.push(TokenTree::Token(DUMMY_SP, Token::Underscore));
    match_body.push(TokenTree::Token(DUMMY_SP, Token::FatArrow));
    match_body.push(TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("None")), IdentStyle::Plain)));
    match_body.push(TokenTree::Token(DUMMY_SP, Token::Comma));	
    
    ast::MacroDef {
        ident: ast::Ident::with_empty_ctxt(intern("millefeuille_ffi_map")),
        attrs: vec![],
        id: ast::DUMMY_NODE_ID,
        span: DUMMY_SP,
        imported_from: None,
        export: true,
        use_locally: true,
        allow_internal_unstable: false,
        body: vec![
        	TokenTree::Delimited(DUMMY_SP, Rc::new(Delimited {
        	        delim: DelimToken::Paren,
        	        open_span: DUMMY_SP,
        	        close_span: DUMMY_SP,
        	        tts: vec![],
        	    })
        	),
        	TokenTree::Token(DUMMY_SP, Token::FatArrow),
        	TokenTree::Delimited(DUMMY_SP, Rc::new(Delimited {
        	        delim: DelimToken::Brace,
        	        open_span: DUMMY_SP,
        	        close_span: DUMMY_SP,
        	        tts: vec![
        	        	TokenTree::Token(DUMMY_SP, Token::BinOp(BinOpToken::Or)),
        	        	TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("x")), IdentStyle::Plain)),
        	        	TokenTree::Token(DUMMY_SP, Token::BinOp(BinOpToken::Or)),
        	        	TokenTree::Token(DUMMY_SP, Token::RArrow),
        	        	TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("Option")), IdentStyle::Plain)),
        	        	TokenTree::Token(DUMMY_SP, Token::Lt),
        	        	TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("fn")), IdentStyle::Plain)),
        	        	TokenTree::Delimited(DUMMY_SP, Rc::new(Delimited {
                    	        delim: DelimToken::Paren,
                    	        open_span: DUMMY_SP,
                    	        close_span: DUMMY_SP,
                    	        tts: vec![
                    	        	TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("Packet")), IdentStyle::Plain)),
                    	        ],
                    	    })
                    	),
        	        	TokenTree::Token(DUMMY_SP, Token::RArrow),
        	        	TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("Packet")), IdentStyle::Plain)),
        	        	TokenTree::Token(DUMMY_SP, Token::Gt),
        	        	
        	        	
        	        	//->Option<fn(Packet)->Packet>
        	        	
        	        	TokenTree::Delimited(DUMMY_SP, Rc::new(Delimited {
                    	        delim: DelimToken::Brace,
                    	        open_span: DUMMY_SP,
                    	        close_span: DUMMY_SP,
                    	        tts: vec![
                    	        	TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("match")), IdentStyle::Plain)),
                    	        	TokenTree::Token(DUMMY_SP, Token::Ident(ast::Ident::with_empty_ctxt(intern("x")), IdentStyle::Plain)),
                    	        	TokenTree::Delimited(DUMMY_SP, Rc::new(Delimited {
                                	        delim: DelimToken::Brace,
                                	        open_span: DUMMY_SP,
                                	        close_span: DUMMY_SP,
                                	        tts: match_body,
                                	    })
                                	),
                    	        ],
                    	    })
                    	),
        	        ],
        	    })
        	),
        	TokenTree::Token(DUMMY_SP, Token::Semi),
        ],
    }
}