source_generator 0.0.3

Basic source code generation features
Documentation
use linked_hash_set::LinkedHashSet;

use crate::element::Element;
use crate::vhdl::library_use::LibraryUse;
use crate::vhdl::keywords::*;

#[derive(Clone)]
pub struct Library {
    name : String,
    uses : LinkedHashSet< LibraryUse >
}

impl Library {
    pub fn new( name : & str ) -> Library {
        Library { name : String::from( name ),
                uses : LinkedHashSet::new() }
    }

    pub fn get_name( & self ) -> & String {
        & self.name
    }

    pub fn add_use( & mut self, library_use : LibraryUse ) {
        self.uses.insert( library_use );
    }
}

impl Element for Library {
    fn to_source_code( & self, indent : usize ) -> String {
        let mut source = String::new();
        let indent_str = crate::util::indent( indent );

        source.push_str( & format!( "{}{} {};\n", indent_str, LIBRARY, self.name ) );
        for u in & self.uses {
            source.push_str( & u.to_source_code( indent + 1 ) );
        }

        return source;
    }
}

//------------------------------------------------------------------------------
#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn library() {
        let l = Library::new( "ieee" );

        assert_eq!(
            l.to_source_code( 0 ),
            String::from( "library ieee;\n" )
        );
    }

    #[test]
    fn library_with_use() {
        let mut l = Library::new( "ieee" );
        l.add_use( LibraryUse::new( "ieee", "std_logic_1164" ) );
        l.add_use( LibraryUse::new( "ieee", "std_logic_1164" ) );
        l.add_use( LibraryUse::new( "ieee", "numeric_std" ) );

        assert_eq!(
            l.to_source_code( 0 ),
            String::from( "library ieee;\n    use ieee.std_logic_1164.all;\n    use ieee.numeric_std.all;\n" )
        );
    }
}