commit 63703b1093a1a255fa919f9f97f76688c77145e1
parent d33916984fa73979b58d83294dbc5e2b049a2378
Author: marisa <mokou@posteo.de>
Date: Mon, 11 Nov 2019 21:47:35 +0100
Cast frontmatter to json values
Diffstat:
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 }
});