You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: dynamic_urls.rs
    path of file: ./repos/fastn/fastn-core/src/sitemap
    
    the code of the file until where you have to start completion: // document and path-parameters
pub(crate) type ResolveDocOutput = (
    Option<String>,
    Vec<(String, ftd::Value)>,
    std::collections::BTreeMap<String, String>,
);

#[derive(Debug, serde::Deserialize, Clone)]
pub struct DynamicUrlsTemp {
    #[serde(rename = "dynamic-urls-body")]
    pub body: String,
}

#[derive(Debug, Clone, PartialEq)]
pub struct DynamicUrls {
    pub sections: Vec<fastn_core::sitemap::section::Section>,
}

impl D
    
    fn parse_dynamic_urls() {
        let left = fastn_core::sitemap::DynamicUrls::parse(
            &std::collections::HashMap::new(),
            "abrark.com",
            r#"
# Dynamic Urls Section
- Url 1
  url: /person/<string:name>/
  document: person.ftd
  readers: readers/person
  writers: writers/person
- Url 2
  url: /person/<string:name>/
  document: person.ftd
  readers: readers/person
  writers: writers/person
"#,
        );

        let right = Ok(fastn_core::sitemap::DynamicUrls {
            sections: vec![fastn_core::sitemap::section::Section {
                id: "Dynamic Urls Section".to_string(),
                icon: None,
                bury: false,
                title: Some("Dynamic Urls Section".to_string()),
                file_location: None,
                translation_file_location: None,
                extra_data: Default::default(),
                is_active: false,
                nav_title: None,
                subsections: vec![fastn_core::sitemap::section::Subsection {
                    id: None,
                    icon: None,
                    bury: false,
                    title: None,
                    file_location: None,
                    translation_file_location: None,
                    visible: false,
                    extra_data: Default::default(),
                    is_active: false,
                    nav_title: None,
                    toc: vec![
                        fastn_core::sitemap::toc::TocItem {
                            id: "/person/<string:name>/".to_string(),
                            icon: None,
                            bury: false,
                            title: Some("Url 1".to_string()),
                            file_location: None,
                            translation_file_location: None,
                            extra_data: vec![
                                ("document", "person.ftd"),
                                ("readers", "readers/person"),
                                ("url", "/person/<string:name>/"),
                                ("writers", "writers/person"),
                            ]
                            .into_iter()
                            .map(|(a, b)| (a.to_string(), b.to_string()))
                            .collect(),
                            is_active: false,
                            nav_title: None,
                            children: vec![],
                            skip: false,
                            readers: vec!["readers/person".to_string()],
                            writers: vec!["writers/person".to_string()],
                            document: Some("person.ftd".to_string()),
                            confidential: true,
                            path_parameters: vec![
                                fastn_core::sitemap::PathParams::value(0, "person".to_string()),
                                fastn_core::sitemap::PathParams::named(
                                    1,
                                    "name".to_string(),
                                    "string".to_string(),
                                ),
                            ],
                        },
                        fastn_core::sitemap::toc::TocItem {
                            id: "/person/<string:name>/".to_string(),
                            icon: None,
                            bury: false,
                            title: Some("Url 2".to_string()),
                            file_location: None,
                            translation_file_location: None,
                            extra_data: vec![
                                ("document", "person.ftd"),
                                ("readers", "readers/person"),
                                ("url", "/person/<string:name>/"),
                                ("writers", "writers/person"),
                            ]
                            .into_iter()
                            .map(|(a, b)| (a.to_string(), b.to_string()))
                            .collect(),
                            is_active: false,
                            nav_title: None,
                            children: vec![],
                            skip: false,
                            readers: vec!["readers/person".to_string()],
                            writers: vec!["writers/person".to_string()],
                            document: Some("person.ftd".to_string()),
                            confidential: true,
                            path_parameters: vec![
                                fastn_core::sitemap::PathParams::value(0, "person".to_string()),
                                fastn_core::sitemap::PathParams::named(
                                    1,
                                    "name".to_string(),
                                    "string".to_string(),
                                ),
                            ],
                        },
                    ],
                    skip: false,
                    readers: vec![],
                    writers: vec![],
                    document: None,
                    confidential: true,
                    path_parameters: vec![],
                }],
                skip: false,
                confidential: true,
                readers: vec![],
                writers: vec![],
                document: None,
                path_parameters: vec![],
            }],
        });
        assert_eq!(left, right)
    }