shtola

ssg in rust
git clone https://tilde.team/~marisa/repo/shtola.git
Log | Files | Refs | LICENSE

commit 63703b1093a1a255fa919f9f97f76688c77145e1
parent d33916984fa73979b58d83294dbc5e2b049a2378
Author: marisa <mokou@posteo.de>
Date:   Mon, 11 Nov 2019 21:47:35 +0100

Cast frontmatter to json values

Diffstat:
MCargo.lock | 20+++++++++++++++++++-
Mshtola/Cargo.toml | 2+-
Mshtola/src/frontmatter.rs | 12++++++------
Mshtola/src/lib.rs | 15+++++++--------
Mshtola/src/tests.rs | 21++++++++-------------
5 files changed, 41 insertions(+), 29 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -22,6 +22,11 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] +name = "dtoa" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] name = "fnv" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -147,6 +152,17 @@ dependencies = [ ] [[package]] +name = "serde_yaml" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", + "yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] name = "shtola" version = "0.1.0" dependencies = [ @@ -155,9 +171,9 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "pathdiff 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)", "ware 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -239,6 +255,7 @@ dependencies = [ "checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d" "checksum bstr 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8d6c2c5b58ab920a4f5aeaaca34b4488074e8cc7596af94e6f8c6ff247c60245" "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +"checksum dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "925aa2cac82d8834e2b2a4415b6f6879757fb5c0928fc445ae76461a12eed8f2" "checksum im 13.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8db49f8bc08d5cc4e2bb0f7d25a6d1db2c79bc6f7d7c86c96c657eb3d214125f" @@ -257,6 +274,7 @@ dependencies = [ "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4b39bd9b0b087684013a792c59e3e07a46a01d2322518d8a1104641a0b1be0" "checksum serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)" = "2f72eb2a68a7dc3f9a691bfda9305a1c017a6215e5a4545c258500d2099a37c2" +"checksum serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)" = "691b17f19fc1ec9d94ec0b5864859290dff279dbd7b03f017afda54eb36c3c35" "checksum sized-chunks 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f01db57d7ee89c8e053245deb77040a6cc8508311f381c88749c33d4b9b78785" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" diff --git a/shtola/Cargo.toml b/shtola/Cargo.toml @@ -15,7 +15,7 @@ log = "0.4.8" walkdir = "2.2.9" ware = "0.1.0" im = "13.0.0" -yaml-rust = "0.4.3" pathdiff = "0.1.0" globset = "0.4.4" serde_json = "1.0.41" +serde_yaml = "0.8.11" diff --git a/shtola/src/frontmatter.rs b/shtola/src/frontmatter.rs @@ -1,6 +1,6 @@ -use yaml_rust::{Yaml, YamlLoader}; +use serde_json::{json, Value}; +use serde_yaml::from_str; -#[allow(dead_code)] pub fn lexer(text: &str) -> (String, String) { if text.starts_with("---\n") { let slice_after_marker = &text[4..]; @@ -16,10 +16,10 @@ pub fn lexer(text: &str) -> (String, String) { } } -#[allow(dead_code)] -pub fn to_yaml(matter: &str) -> Vec<Yaml> { +pub fn to_json(matter: &str) -> Value { if matter.len() == 0 { - return Vec::new(); + return json!(null); } - YamlLoader::load_from_str(matter).unwrap() + let yaml: Value = from_str(matter).unwrap(); + yaml } diff --git a/shtola/src/lib.rs b/shtola/src/lib.rs @@ -1,5 +1,6 @@ use globset::{Glob, GlobSetBuilder}; use pathdiff::diff_paths; +use serde_json::json; use std::default::Default; use std::fs; use std::io::{Read, Write}; @@ -7,10 +8,8 @@ use std::path::PathBuf; use walkdir::WalkDir; pub use im::HashMap; -pub use ware::Ware; -pub use yaml_rust::Yaml; -pub use serde_json::Value; pub use serde_json as json; +pub use ware::Ware; mod frontmatter; #[cfg(test)] @@ -90,7 +89,7 @@ impl Shtola { pub struct IR { files: HashMap<PathBuf, ShFile>, config: Config, - metadata: HashMap<String, Value>, + metadata: HashMap<String, json::Value>, } #[derive(Debug, Clone)] @@ -116,7 +115,7 @@ impl Default for Config { #[derive(Debug, Clone)] pub struct ShFile { - frontmatter: Vec<Yaml>, + frontmatter: json::Value, content: Vec<u8>, } @@ -136,14 +135,14 @@ fn read_dir( fs::File::open(path)?.read_to_string(&mut content)?; if frontmatter { let (matter, content) = frontmatter::lexer(&content); - let yaml = frontmatter::to_yaml(&matter); + let json = frontmatter::to_json(&matter); file = ShFile { - frontmatter: yaml, + frontmatter: json, content: content.into(), }; } else { file = ShFile { - frontmatter: Vec::new(), + frontmatter: json!(null), content: content.into(), }; } diff --git a/shtola/src/tests.rs b/shtola/src/tests.rs @@ -1,7 +1,7 @@ -use crate::{Shtola, IR, HashMap, ShFile, Yaml}; use crate::json::json; -use std::path::PathBuf; +use crate::{HashMap, ShFile, Shtola, IR}; use std::fs; +use std::path::PathBuf; #[test] fn read_works() { @@ -66,13 +66,7 @@ fn frontmatter_works() { s.clean(true); let r = s.build().unwrap(); let (_, matter_file) = r.files.iter().last().unwrap(); - let frontmatter = matter_file.frontmatter[0] - .as_hash() - .unwrap() - .get(&Yaml::from_str("hello")) - .unwrap() - .as_str() - .unwrap(); + let frontmatter = matter_file.frontmatter.get("hello").unwrap(); assert_eq!(frontmatter, "bro"); } @@ -86,7 +80,7 @@ fn no_frontmatter_works() { let r = s.build().unwrap(); let (_, matter_file) = r.files.iter().last().unwrap(); dbg!(matter_file); - assert!(matter_file.frontmatter.is_empty()); + assert!(matter_file.frontmatter.is_null()); } #[test] @@ -102,7 +96,6 @@ fn ignore_works() { assert_eq!(path.to_str().unwrap(), "not_ignored.md"); } - #[test] fn metadata_works() { let mut s = Shtola::new(); @@ -110,8 +103,10 @@ fn metadata_works() { s.destination("../fixtures/dest_meta"); s.clean(true); let mw1 = Box::new(|ir: IR| { - let metadata = ir.metadata.update("test".into(), json!("foo")) - .update("test2".into(), json!({"bar": "baz"})); + let metadata = ir + .metadata + .update("test".into(), json!("foo")) + .update("test2".into(), json!({"bar": "baz"})); IR { metadata, ..ir } });