blog.ojisan.io

Rust ใง frontmatter ใ‹ใ‚‰ใƒ‡ใƒผใ‚ฟใ‚’ๅ–ๅพ—ใ™ใ‚‹

frontmatter ใ‹ใ‚‰ใƒ‡ใƒผใ‚ฟใ‚’ๅ–ใ‚Šๅ‡บใ™

Rust ใง frontmatter ๆ–‡ๅญ—ๅˆ—ใ‹ใ‚‰ใƒ‡ใƒผใ‚ฟใ‚’ๅ–ใ‚Šๅ‡บใ—ใพใ—ใ‚‡ใ†ใ€‚ frontmatter ใฎ parser ใจใ—ใฆใฏใ€rust-frontmatter ใจใ„ใ†ใ‚‚ใฎใŒใ‚ใ‚Šใพใ™ใ€‚

FYI: https://github.com/azdle/rust-frontmatter

cargo-doc ใ‚’่ฆ‹ใ‚Œใฐใ‚„ใ‚Šๆ–นใฏๆƒณๅƒใŒใคใใจใฏๆ€ใ†ใฎใงใ™ใŒใ€ๅ€‹ไบบ็š„ใซใฏ README ใซๆ›ธใ„ใฆใŠใ„ใฆๆฌฒใ—ใ‹ใฃใŸๅ†…ๅฎนใชใฎใงใพใจใ‚ใพใ™ใ€‚

parse ใ—ใ‚ˆใ†

ๆ—ฉ้€Ÿ rust-frontmatter ใ‚’ไฝฟใฃใฆใฟใพใ—ใ‚‡ใ†ใ€‚

cargo add rust-frontmatter
use frontmatter::{parse, Yaml};

let fm = parse(&s);

ใ“ใ‚Œใง parse ใงใใพใ—ใŸใ€‚ ไธญ่บซใฏใฉใ†ใชใฃใฆใ„ใ‚‹ใงใ—ใ‚‡ใ†ใ‹ใ€‚

println!("{:?}", fm)

ใŸใจใˆใฐใ“ใฎใƒ–ใƒญใ‚ฐใฎ frontmatter ใฏ

Ok(Some(Hash({String("path"): String("/rust-frontmatter"), String("created"): String("2021-04-19"), String("title"): String("Rust ใง frontmatter ๆ–‡ๅญ—ๅˆ—ใ‹ใ‚‰ๅ€คใ‚’ๅ–ใ‚Šๅ‡บใ™"), String("visual"): String("./visual.png"), String("tags"): Array([String("Rust"), String("frontmatter")]), String("userId"): String("sadnessOjisan"), String("isFavorite"): Boolean(false), String("isProtect"): Boolean(false)})))

ใจใชใ‚Šใพใ™ใ€‚๏ผˆๅฎŸใฏใ„ใพใƒ–ใƒญใ‚ฐใฎ SSG ใ‚’ Rust ใงๅฎŸ่ฃ…ใ—ใฆใ„ใ‚‹ๆœ€ไธญใงใ™ใ€‚๏ผ‰

Result ๅž‹ใฎไธญใซใ‚ชใƒ—ใ‚ทใƒงใƒณๅž‹ใŒใ‚ใฃใฆใ€ใใฎไธญใซ Hash ใŒๅ…ฅใฃใฆใ„ใ‚‹ใจใ„ใ†ๅฝขใงใ—ใ‚‡ใ†ใ‹ใ€‚

ใใฎ Hash ใ‚’ๅ–ใ‚Šๅ‡บใ—ใฆใฟใพใ—ใ‚‡ใ†ใ€‚

let hash = front.ok().unwrap().unwrap();

ใ•ใฆใงใฏใ“ใฎไธญใ‹ใ‚‰ใƒ‡ใƒผใ‚ฟใ‚’ๅ–ใ‚Šๅ‡บใ—ใฆใฟใพใ—ใ‚‡ใ†ใ€‚

let path = &d["path"];
let title = &d["title"];
let tags = &d["tags"];

ใ“ใ‚Œใ‚‰ใฏใใ‚Œใžใ‚Œใ€

String("/rust-frontmatter")

String("Rust ใง frontmatter ๆ–‡ๅญ—ๅˆ—ใ‹ใ‚‰ๅ€คใ‚’ๅ–ใ‚Šๅ‡บใ™")

Array([String("Rust"), String("frontmatter")])

ใงใ™ใ€‚

ใฉใ†ใ‚„ใฃใฆใ“ใ“ใ‹ใ‚‰ๅ€คใ‚’ๅ–ใ‚Šๅ‡บใ—ใพใ—ใ‚‡ใ†ใ‹ใ€‚

ใใ‚‚ใใ‚‚ Hash ใฏไฝ•ใชใฎใ‹

frontmatter ใฏ --- ใง่ฆ†ใ‚ใ‚ŒใŸ yaml ใ‚„ json ใงใ™ใ€‚ ใใฎใŸใ‚ frontmatter ใฎ parser ใฏ yaml ใฎ parser ใ‚’ๆŒใฃใฆใ„ใพใ™ใ€‚ ใ“ใฎ hash ใฏ yaml-rust ใจใ„ใ†ใ‚ฏใƒฌใƒผใƒˆใŒ่ฟ”ใ—ใฆใ„ใŸๅ€คใงใ™ใ€‚ rust-frontmatter ใฏ yaml-rust ใธใฎไพๅญ˜ใ‚’ๆŒใฃใฆใ„ใพใ™ใ€‚

FYI: https://github.com/chyh1990/yaml-rust

hash ใจใ—ใฆ่ฆ‹ใˆใฆใ„ใŸๅ€คใฏ yaml-rust ใฎ Yaml Enum ใŒๆŒใค Variant ใงใ™ใ€‚

FYI: https://docs.rs/yaml-rust/0.4.5/yaml_rust/yaml/enum.Yaml.html

ใใ‚Œใ‚‰ใฏ as_str, as_vec ใชใฉใฎๅค‰ๆ›ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๆŒใฃใฆใ„ใ‚‹ใฎใงใใ‚Œใ‚’ไฝฟใˆใฐๅ€คใ‚’ๅ–ใ‚Šๅ‡บใ›ใพใ™ใ€‚

#[derive(Debug)]
struct PostMeta {
    path: String,
    title: String,
    tags: Vec<String>,
}

fn parse_frontmatter(s: &str) -> PostMeta {
    let front = parse(&s);
    let d = front.ok().unwrap().unwrap();
    let path = &d["path"];
    let title = &d["title"];
    let tags = &d["tags"];
    PostMeta {
        path: path.as_str().unwrap().to_string(),
        title: title.as_str().unwrap().to_string(),
        tags: tags
            .as_vec()
            .unwrap()
            .into_iter()
            .map(|x| x.as_str().unwrap().to_string())
            .collect(),
    }
}