source_generator/vhdl/
generic_list.rs

1use crate::element::Element;
2use crate::element::to_source_code_list;
3use crate::vhdl::generic::Generic;
4use crate::vhdl::keywords::GENERIC;
5
6pub struct GenericList {
7    generics : Vec< Box< dyn Element > >
8}
9
10impl GenericList {
11    pub fn new() -> GenericList {
12        GenericList { generics : Vec::new() }
13    }
14
15    pub fn add_generic( & mut self, generic : Generic ) {
16        self.generics.push( Box::new( generic ) );
17    }
18}
19
20impl Element for GenericList {
21    fn to_source_code( & self, indent : usize ) -> String {
22        let mut source = String::new();
23        if self.generics.is_empty() {
24            return source;
25        }
26
27        let indent_str = crate::util::indent( indent + 1 );
28        let list_indent_str = crate::util::indent( indent + 2 );
29        let list = to_source_code_list( & self.generics, & format!( ";\n{}", list_indent_str ) );
30        source.push_str( & format!( "{}{} (\n{}{}\n{});\n", indent_str, GENERIC, list_indent_str,
31                list, indent_str ) );
32        return source;
33    }
34}
35
36//------------------------------------------------------------------------------
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    const GENERICS : &'static str = concat!( "    generic (\n", "        a : integer := 0;\n",
42        "        b : std_logic := '0';\n", "        c : boolean\n", "    );\n" );
43
44    /**
45     * Create a library list with three entries
46     */
47    #[test]
48    fn generic_list() {
49        let mut generic_list = GenericList::new();
50        generic_list.add_generic( Generic::new_with_default( "a", "integer", "0" ) );
51        generic_list.add_generic( Generic::new_with_default( "b", "std_logic", "'0'" ) );
52        generic_list.add_generic( Generic::new( "c", "boolean" ) );
53
54        assert_eq!(
55            generic_list.to_source_code( 0 ),
56            format!( "{}", GENERICS )
57        );
58    }
59}
60