# functions

snippet     fn
abbr        fn () {}
options     head
    fn ${1:#:func_name}(${2:#:args}) {
        ${0:TARGET}
    }

snippet     fn-
abbr        fn () {}
options     head
    fn ${1:#:func_name}(${2:#:args}) -> ${3:#:()} {
        ${0:TARGET}
    }

snippet     pubfn
abbr        pubfn () {}
options     head
    pub fn ${1:#:func_name}(${2:#:args}) -> ${3:#:()} {
        ${0:TARGET}
    }

snippet     test
options     head
    #[test]
    fn ${1:#:test_function_name}() {
        ${0:TARGET}
    }

snippet     pubnew
abbr        pub fn new() {}
options     head
    pub fn new(${1}) -> ${2:#:Name} {
        ${0:TARGET}
    }

# macros

snippet     macro
    ${1:#:macro_name}!(${2})${3}

snippet     bfl
abbr        bitflags!
    bitflags! {
        ${0:TARGET}
    }

snippet     pln
abbr        println!
    println!(${1:"\{\}"}, ${0:TARGET});

snippet     fm
abbr        format!
    format!("${1:\{\}}", ${0:TARGET});

# attributes

snippet     ec
abbr        extern crate
options     head
    extern crate ${0:TARGET};
    
snippet     ecl
abbr        extern crate log
options     head
    #![feature(phase)]
    #[phase(plugin, link)] extern crate log;

snippet     crate
options     head
    #![crate_name=${1:#:crate_name}]

snippet     derive
options     head
    #[derive(${1:TARGET})]${2}

# statements

snippet     mod
options     head
    mod ${1:#:mod_name} {
        ${0:TARGET}
    }

snippet     let
    let ${1:TARGET} = ${2};${3}

snippet     if
abbr        if {}
    if ${1:#:condition} {
        ${0:TARGET}
    }

snippet else
    else {
        ${0:TARGET}
    }

snippet elseif
    } else if (${1:#:condition}) {
        ${0:TARGET}
    }

snippet     ifelse
abbr        if () {} else {}
    if ${1:#:condition} {
        ${2:TARGET}
    } else {
        ${3}
    }

snippet     forin
abbr        forin  {}
    for ${1} in ${2} {
        ${0:TARGET}
    }

snippet     match
    match ${1:TARGET} {
        ${2:#:pattern} => ${3:#expr},${4}
    }

snippet     mcase
alias       case
    ${1:TARGET} => ${2:#expr},${3}

# data

snippet     struct
options     head
    struct ${1} {
        ${0:TARGET}
    }

snippet     pubstruct
abbr        pub struct
options     head
    pub struct ${1} {
        ${0:TARGET}
    }

snippet     enum
options     head
    enum ${1} {
        ${0:TARGET}
    }

snippet     opt
abbr        Option<A>
    Option<${1:()}>${2}

snippet     res
abbr        Result<A, B>
    Result<${1:#:~str}, ${2:#:()}>${3}