pub fn my_cv() -> CV {
    let sdev = String::from("Software developer");
    let szl = vec![String::from("Shenzhen")];
    CV {
        details: vec![
            Detail {
                key: String::from("Available Location"),
                value: String::from("Wellington or remote"),
                href: None
            },
            Detail {
                key: String::from("Contact email"),
                value: String::from("quick.dudley@gmail.com"),
                href: Some(String::from("mailto:quick.dudley@gmail.com"))
            },
            Detail {
                key: String::from("Contact phone"),
                value: String::from("027 240 9472"),
                href: None
            },
            Detail {
                key: String::from("Github profile"),
                value: String::from("https://github.com/quickdudley"),
                href: Some(String::from("https://github.com/quickdudley"))
            },
            Detail {
                key: String::from("Drivers license"),
                value: String::from("New Zealand: Class 1 full"),
                href: None
            },
            Detail {
                key: String::from("Citizenship"),
                value: String::from("New Zealand"),
                href: None
            }
        ],
        statement: String::from("I have been designing, developing, and maintaining web based applications for about 8 years, and other types of software for another 2. I am comfortable working with several different programming languages and frameworks, and can quickly pick up new ones."),
        skills: vec![
            Skill { description: String::from("Programming; Ruby, Java, JavaScript, PHP, C, and others"), items: vec![] },
            Skill { description: String::from("Software and database development; Ruby on Rails, PostgreSQL"), items: vec![] },
            Skill { description: String::from("Application Integration"), items: vec![] },
            Skill {
                description: String::from("Gathering Requirements"),
                items: vec![
                    Skill { description: String::from("High level expectations and required domain knowledge via discussion with customers"), items: vec![] },
                    Skill { description: String::from("Technical requirements for integration with other systems, including from published documentation and via discussion with third parties."), items: vec![] }
                ]
            },
        ],
        work_history: vec![
            Role {
                company: String::from("CricHQ"),
                period: (Month { year: 2021, month: 5 }, None),
                title: sdev.clone(),
                location: vec![String::from("Wellington")],
                description: String::from("I am working on CricHQ's web based cricket tools, with an initial focus on the player registration system. This project is in Ruby on Rails, PostgreSQL, and React."),
            },
            Role {
                company: String::from("Youdo Limited"),
                period: (Month { year: 2018, month: 2 }, Some(Month { year: 2021, month: 3})),
                title: sdev.clone(),
                location: vec![String::from("Wellington")],
                description: String::from("I developed and maintained applications for a variety of customers (primarily Transpower) using Ruby on Rails, PostgreSQL, and either React or JQuery depending on the age of the project. Some projects included incidental use of other languages and technologies such as Lua and shell scripts."),
            },
            Role {
                company: String::from("iSoftStone Information Technology co. ltd"),
                period: (Month { year: 2015, month: 12 }, Some(Month { year: 2017, month: 3 })),
                title: sdev.clone(),
                location: szl.clone(),
                description: String::from("I worked on two projects for Huawei: OpenAPI and B2B. For both projects we used Java and Oracle Database. For OpenAPI we also used WS02 and Huawei Application Engine, and for B2B we used Tibco. We also used Struts to create stand-ins for third party APIs during testing. I also translated sections of the WS02 documentation into Mandarin for other team members’ reference, and verified that documented features were working correctly."),
            },
            Role {
                company: String::from("Fantem IoT Technology co. ltd"),
                period: (Month { year: 2014, month: 9 }, Some(Month { year: 2015, month: 8})),
                title: sdev.clone(),
                location: szl.clone(),
                description: String::from("I maintained public websites for Fantem, Aeotec, and some individual product lines. Developed and maintained various applications for internal use. I used PHP, JQuery, MySQL, and provided some integration with Wordpress."),
            },
            Role {
                company: String::from("Fushijierui Technology co. ltd"),
                period: (Month { year: 2013, month: 9 }, Some(Month { year: 2014, month: 7 })),
                title: String::from("Technical manager"),
                location: szl.clone(),
                description: String::from("I was in charge of all technical aspects of this startup company, including creating a plan for our project, hiring additional developers, providing some training, day to day management, and negotiation with third parties. I also spent a lot of time developing, with Java servlets and JSP."),
            },
            Role {
                company: String::from("Worldfastpay Financial Technology co. ltd"),
                period: (Month { year: 2013, month: 3 }, Some(Month {year: 2013, month: 8})),
                title: sdev.clone(),
                location: szl.clone(),
                description: String::from("I wrote payment plugins in PHP for online shopping platforms such as Opencart and Magento for accepting payment via WorldFastPay."),
            },
            Role {
                company: String::from("iBaby Labs ltd"),
                period: (Month { year: 2012, month: 3}, Some(Month { year: 2013, month: 1 })),
                title: sdev.clone(),
                location: vec![String::from("Shenzhen"),String::from("Tianjin")],
                description: String::from("I wrote IP camera internal software in C. I was responsible for system settings, network configuration (including router port forwarding setup via UPnP), pan and tilt control, and LED control. The camera main board was running embedded Linux, and the hardware control was via custom ioctls."),
            },
            Role {
                company: String::from("Synapse Group"),
                period: (Month { year: 2007, month: 7 }, Some(Month { year: 2008, month: 8 })),
                title: String::from("QA tester"),
                location: vec![String::from("Wellington")],
                description: String::from("My primary role was testing J2ME games prior to their release on the New Zealand Telecom (now known as Spark) network, but I was also responsible for creating a pre-release script which parsed our test results, generated handset mapping files, and created zip archives containing the handset mapping file as well as the final build for each handset."),
            }
        ],
        tabulars: vec![
            Tabular {
                title: String::from("Education"),
                entries: vec![
                    (String::from("2008 - 2011"), String::from("Victoria University of Wellington: Computer science undergraduate")),
                    (String::from("1998 - 2001"), String::from("Wairarapa College"))
                ],
            },
            Tabular {
                title: String::from("Languages"),
                entries: vec![
                    (String::from("English"), String::from("native")),
                    (String::from("Mandarin"), String::from("near fluent")),
                    (String::from("French"), String::from("conversational"))
                ],
            }
        ],
    }
}

pub struct CV {
    details: Vec<Detail>,
    statement: String,
    skills: Vec<Skill>,
    work_history: Vec<Role>,
    tabulars: Vec<Tabular>,
}

pub struct Detail {
    key: String,
    value: String,
    href: Option<String>,
}

pub struct Skill {
    description: String,
    items: Vec<Skill>,
}

pub struct Role {
    company: String,
    period: (Month, Option<Month>),
    title: String,
    location: Vec<String>,
    description: String,
}

pub struct Month {
    year: u16,
    month: u8,
}

pub struct Tabular {
    title: String,
    entries: Vec<(String,String)>,
}