From 1038351f4a0f7fd41370ebd4abe3c1c4a7fd4d77 Mon Sep 17 00:00:00 2001 From: Lumither Tao Date: Wed, 26 Mar 2025 19:52:19 -0700 Subject: [PATCH] feat(markdown) add from_str --- backend/markdown/src/lib.rs | 34 +++++++++++----------- backend/markdown/src/utils/front_matter.rs | 17 ++++++----- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/backend/markdown/src/lib.rs b/backend/markdown/src/lib.rs index 44c5d6a..e616146 100644 --- a/backend/markdown/src/lib.rs +++ b/backend/markdown/src/lib.rs @@ -1,20 +1,20 @@ mod error; mod utils; -use std::fs; -use std::path::Path; +use std::{fs, path::Path, str::FromStr}; -use crate::error::Error; -use crate::utils::front_matter::{parse_front_matter, split_md_front_matter}; +use crate::{ + error::Error, + utils::front_matter::{parse_front_matter, split_md_front_matter}, +}; -use base64::{engine::general_purpose, Engine}; +use base64::{Engine, engine::general_purpose}; use serde::Serialize; use serde_json::Value; use sha2::{Digest, Sha256}; #[derive(Default, Debug, Serialize)] pub struct MdFile { - pub filename: String, pub meta: Value, pub content: String, pub hash: String, @@ -26,22 +26,22 @@ impl MdFile { Ok(file) => file, Err(e) => return Err(Error::FSError { msg: e.to_string() }), }; - let raw_file_bytes = raw_file.as_bytes().to_vec(); - let (front_matter_str, content) = split_md_front_matter(raw_file); + Self::from_str(&raw_file) + } +} + +impl FromStr for MdFile { + type Err = Error; + + fn from_str(s: &str) -> Result { + let bytes = s.as_bytes().to_vec(); + let (front_matter_str, content) = split_md_front_matter(s); let front_matter = match parse_front_matter(&front_matter_str) { Ok(front_matter) => front_matter, Err(e) => return Err(Error::InvalidFrontMatter { msg: e.to_string() }), }; - let hash = calculate_hash_base64(&raw_file_bytes); - let file_name = Path::new(file_path) - .file_name() - .unwrap() - .to_str() - .unwrap() - .to_string(); - + let hash = calculate_hash_base64(&bytes); Ok(MdFile { - filename: file_name, meta: front_matter, content, hash, diff --git a/backend/markdown/src/utils/front_matter.rs b/backend/markdown/src/utils/front_matter.rs index 5bf77d2..966b390 100644 --- a/backend/markdown/src/utils/front_matter.rs +++ b/backend/markdown/src/utils/front_matter.rs @@ -1,17 +1,19 @@ +use std::error::Error; + use crate::utils::yaml::yaml_to_serde; + use regex::Regex; use serde_json::Value; -use std::error::Error; use yaml_rust2::YamlLoader; -pub fn split_md_front_matter(raw_file: String) -> (String, String) { +pub fn split_md_front_matter(raw_file: &str) -> (String, String) { let re = Regex::new(r"(?s)^(---\n.*?\n---\n)(.*)").unwrap(); - if let Some(captures) = re.captures(raw_file.as_str()) { + if let Some(captures) = re.captures(raw_file) { let front_matter = captures.get(1).map_or("", |m| m.as_str()).to_string(); let main_content = captures.get(2).map_or("", |m| m.as_str()).to_string(); (front_matter, main_content) } else { - (String::new(), raw_file) + (String::new(), raw_file.to_string()) } } @@ -43,8 +45,7 @@ tags: [ "test1", "test2" ] test body -"## - .to_string(), +"##, ); assert_eq!( front_matter, @@ -64,7 +65,7 @@ tags: [ "test1", "test2" ] #[test] fn test_front_matter_parser() { - dbg!(parse_front_matter( + parse_front_matter( r##"--- title: test_title date: 0000-00-00+0000 @@ -75,7 +76,7 @@ summary: summary tags: [ "test1", "test2" ] --- "##, - )) + ) .expect("Failed to parse front matter"); } }