source_generator 0.0.3

Basic source code generation features
Documentation
use crate::element::Element;
use crate::vhdl::generic::Generic;

#[derive(Clone)]
pub struct GenericBinding {
    inner : String,
    data_type : String,
    outer : String,
    requires_binding : bool
}

impl GenericBinding {
    pub fn from_generic( generic : & Generic ) -> GenericBinding{
        GenericBinding { inner : generic.get_name().to_string(),
                data_type : generic.get_data_type().to_string(),
                outer : String::new(), requires_binding : ! generic.has_default() }
    }

    pub fn connect( & mut self, generic : & Generic ) {
        self.outer = generic.get_name().to_string();
    }

    pub fn connect_by_name( & mut self, outer : & str ) {
        self.outer = outer.to_string();
    }

    pub fn get_inner( & self ) -> & String {
        & self.inner
    }

    pub fn get_data_type( & self ) -> & String {
        & self.data_type
    }

    pub fn get_outer( & self ) -> & String {
        & self.outer
    }

    pub fn is_bound( & self ) -> bool {
        ! self.outer.is_empty()
    }

    pub fn requires_binding( & self ) -> bool {
        self.requires_binding
    }
}

impl Element for GenericBinding {
    fn to_source_code( & self, indent : usize ) -> String {
        let mut source = String::new();
        if self.outer.is_empty() && ! self.requires_binding {
            return source;
        }
        let indent_str = crate::util::indent( indent );
        source.push_str( & format!( "{}{} => {}", indent_str, self.inner, self.outer ) );
        return source;
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn from_generic() {
        let binding = GenericBinding::from_generic( & Generic::new( "test", "boolean" ) );
        assert_eq!( & binding.to_source_code( 0 ), "test => " );
    }

    #[test]
    fn connect_to_generic() {
        let generic = Generic::new( "extern", "boolean" );
        let mut binding = GenericBinding::from_generic( & Generic::new( "test", "boolean" ) );
        binding.connect( & generic );
        assert_eq!( & binding.to_source_code( 0 ), "test => extern" );
    }
}