From 36f0e07c29ec4e3feabf681ea9b51188bb57b1af Mon Sep 17 00:00:00 2001 From: tiye Date: Sun, 25 Feb 2024 17:39:12 +0800 Subject: [PATCH] upgrade edn to fix; tag 0.2.2 --- .github/workflows/check.yaml | 8 +++--- Cargo.lock | 10 +++---- Cargo.toml | 4 +-- build.sh | 8 ++++-- src/date.rs | 56 ++++++++++++++++++++---------------- src/fs.rs | 6 ++-- src/json.rs | 24 ++++++++-------- src/process.rs | 4 +-- 8 files changed, 64 insertions(+), 56 deletions(-) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 494b870..838f93b 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -21,15 +21,15 @@ jobs: - uses: supplypike/setup-bin@v3 with: - uri: "https://github.com/calcit-lang/calcit/releases/download/0.8.28/cr" + uri: "https://github.com/calcit-lang/calcit/releases/download/0.8.36/cr" name: "cr" - version: "0.8.28" + version: "0.8.36" - uses: supplypike/setup-bin@v3 with: - uri: "https://github.com/calcit-lang/calcit/releases/download/0.8.28/caps" + uri: "https://github.com/calcit-lang/calcit/releases/download/0.8.36/caps" name: "caps" - version: "0.8.28" + version: "0.8.36" - run: cargo build --release diff --git a/Cargo.lock b/Cargo.lock index 4bb1dd6..a49e3d3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,7 +56,7 @@ checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" [[package]] name = "calcit_std" -version = "0.2.1" +version = "0.2.2" dependencies = [ "chrono", "cirru_edn", @@ -100,9 +100,9 @@ dependencies = [ [[package]] name = "cirru_edn" -version = "0.5.4" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fedb67d87075cec51cc76323ebceb2e177c157ab06b4111e37849e5e15f5db7" +checksum = "08d343bd5f40a4d0c77552307fa1d4a1457ebdafe988a5a478c8b15b59b89087" dependencies = [ "bincode", "cirru_parser", @@ -112,9 +112,9 @@ dependencies = [ [[package]] name = "cirru_parser" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ad2d076b9a6dde2b253341ed2d8752949d8ab3ade476157c859647df6c82eaf" +checksum = "c96247e15778d471f8c94b321fa11220dfb987546fcf8fb73b1a5c2b3a018a78" dependencies = [ "bincode", ] diff --git a/Cargo.toml b/Cargo.toml index dc45d26..79b2301 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "calcit_std" -version = "0.2.1" +version = "0.2.2" authors = ["jiyinyiyong "] edition = "2021" @@ -17,7 +17,7 @@ crate-type = ["dylib"] # Creates dynamic lib serde = { version = "1.0.185", features = ["derive"] } serde_json = "1.0.105" chrono = "0.4.26" -cirru_edn = "0.5.4" +cirru_edn = "0.6.2" cirru_parser = "0.1.28" nanoid = "0.4.0" rand = "0.8.5" diff --git a/build.sh b/build.sh index dbcefd0..b4f8628 100755 --- a/build.sh +++ b/build.sh @@ -1,3 +1,5 @@ -cargo build --release -rm -rfv dylibs/ -mkdir -p dylibs/ && ls target/release/ && cp -v target/release/libcalcit_std.* dylibs/ +cargo build --release && \ +rm -rfv dylibs && \ +mkdir -p dylibs/ && \ +ls target/release/ && \ +cp -v target/release/libcalcit_std.* dylibs/ diff --git a/src/date.rs b/src/date.rs index 88b4726..18d7284 100644 --- a/src/date.rs +++ b/src/date.rs @@ -4,7 +4,7 @@ use std::{collections::HashMap, sync::Arc}; use chrono::{DateTime, Datelike, Duration, Local, LocalResult, NaiveDate, TimeZone, Timelike, Utc, Weekday}; -use cirru_edn::Edn; +use cirru_edn::{Edn, EdnTupleView}; use std::ops::Add; /// calcit represents DateTime in f64 @@ -92,7 +92,7 @@ pub fn extract_time(args: Vec) -> Result { data.insert(Edn::tag("week"), Edn::Number(time.date_naive().iso_week().week() as f64)); data.insert(Edn::tag("week0"), Edn::Number(time.date_naive().iso_week().week0() as f64)); - Ok(Edn::Map(data)) + Ok(Edn::from(data)) } _ => Err(format!("extract-time expected f64 and string, got: {args:?}")), } @@ -114,15 +114,18 @@ pub fn from_ymd(args: Vec) -> Result { .and_hms_opt(0, 0, 0) .ok_or("from_ymd got none")?, ) { - LocalResult::None => Ok(Edn::Tuple(Arc::new(Edn::tag("none")), vec![])), - LocalResult::Single(d) => Ok(Edn::Tuple( - Arc::new(Edn::tag("single")), - vec![Edn::Number(d.timestamp_millis() as f64)], - )), - LocalResult::Ambiguous(d, d2) => Ok(Edn::Tuple( - Arc::new(Edn::tag("ambiguous")), - vec![Edn::Number(d.timestamp_millis() as f64), Edn::Number(d2.timestamp_millis() as f64)], - )), + LocalResult::None => Ok(Edn::Tuple(EdnTupleView { + tag: Arc::new(Edn::tag("none")), + extra: vec![], + })), + LocalResult::Single(d) => Ok(Edn::Tuple(EdnTupleView { + tag: Arc::new(Edn::tag("single")), + extra: vec![Edn::Number(d.timestamp_millis() as f64)], + })), + LocalResult::Ambiguous(d, d2) => Ok(Edn::Tuple(EdnTupleView { + tag: Arc::new(Edn::tag("ambiguous")), + extra: vec![Edn::Number(d.timestamp_millis() as f64), Edn::Number(d2.timestamp_millis() as f64)], + })), } } (a, b, c) => Err(format!("from-ymd expected 2 args, got: {a} {b} {c}")), @@ -147,23 +150,26 @@ pub fn from_ywd(args: Vec) -> Result { 5 => Weekday::Fri, 6 => Weekday::Sat, _ => { - return Ok(Edn::Tuple( - Arc::new(Edn::tag("err")), - vec![Edn::str(format!("invalid digit for weekday: {d}"))], - )) + return Ok(Edn::Tuple(EdnTupleView { + tag: Arc::new(Edn::tag("err")), + extra: vec![Edn::str(format!("invalid digit for weekday: {d}"))], + })) } }; match NaiveDate::from_isoywd_opt(*y as i32, *w as u32, weekday) { Some(time) => match Local.from_local_datetime(&time.and_hms_opt(0, 0, 0).ok_or("hms got none")?) { - LocalResult::None => Ok(Edn::Tuple(Arc::new(Edn::tag("none")), vec![])), - LocalResult::Single(d) => Ok(Edn::Tuple( - Arc::new(Edn::tag("single")), - vec![Edn::Number(d.timestamp_millis() as f64)], - )), - LocalResult::Ambiguous(d, d2) => Ok(Edn::Tuple( - Arc::new(Edn::tag("single")), - vec![Edn::Number(d.timestamp_millis() as f64), Edn::Number(d2.timestamp_millis() as f64)], - )), + LocalResult::None => Ok(Edn::Tuple(EdnTupleView { + tag: Arc::new(Edn::tag("none")), + extra: vec![], + })), + LocalResult::Single(d) => Ok(Edn::Tuple(EdnTupleView { + tag: Arc::new(Edn::tag("single")), + extra: vec![Edn::Number(d.timestamp_millis() as f64)], + })), + LocalResult::Ambiguous(d, d2) => Ok(Edn::Tuple(EdnTupleView { + tag: Arc::new(Edn::tag("single")), + extra: vec![Edn::Number(d.timestamp_millis() as f64), Edn::Number(d2.timestamp_millis() as f64)], + })), }, None => Err(format!("from-ywd got invalid args: {y} {w} {weekday}")), } @@ -186,7 +192,7 @@ pub fn add_duration(args: Vec) -> Result { LocalResult::Ambiguous(min_time, max_time) => return Err(format!("add-duration ambiguous: {min_time} {max_time}")), }; - match &(*k.to_str()) { + match k.ref_str() { "week" | "weeks" => Ok(Edn::Number(time.add(Duration::weeks(*n as i64)).timestamp_millis() as f64)), "day" | "days" => Ok(Edn::Number(time.add(Duration::days(*n as i64)).timestamp_millis() as f64)), "h" | "hour" | "hours" => Ok(Edn::Number(time.add(Duration::hours(*n as i64)).timestamp_millis() as f64)), diff --git a/src/fs.rs b/src/fs.rs index 910eaa7..d46dd33 100644 --- a/src/fs.rs +++ b/src/fs.rs @@ -133,7 +133,7 @@ pub fn read_dir(args: Vec) -> Result { } // println!("child dir: {:?}", content); - Ok(Edn::List(content)) + Ok(Edn::from(content)) } Err(e) => Err(format!("Failed to read dir {name:?}: {e}")), } @@ -248,7 +248,7 @@ pub fn walk_dir(args: Vec) -> Result { content.push(Edn::Str(format!("{}", path.display()).into())); } } - Ok(Edn::List(content)) + Ok(Edn::from(content)) } else { Err(format!("walk-dir expected a string, got: {}", &args[0])) } @@ -273,7 +273,7 @@ pub fn glob_call(args: Vec) -> Result { Err(e) => return Err(format!("Failed to read: {}", e)), } } - Ok(Edn::List(content)) + Ok(Edn::from(content)) } else { Err(format!("glob expected a string, got: {}", &args[0])) } diff --git a/src/json.rs b/src/json.rs index 9b9de3a..4917fe0 100644 --- a/src/json.rs +++ b/src/json.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use serde_json::Value; -use cirru_edn::{Edn, EdnTag}; +use cirru_edn::{Edn, EdnRecordView, EdnTag}; pub fn json_to_edn(data: &Value) -> Edn { match data { @@ -22,7 +22,7 @@ pub fn json_to_edn(data: &Value) -> Edn { for x in xs { ys.push(json_to_edn(x)); } - Edn::List(ys) + Edn::from(ys) } Value::Object(xs) => { let mut ys: HashMap = HashMap::new(); @@ -34,17 +34,17 @@ pub fn json_to_edn(data: &Value) -> Edn { }; ys.insert(key, json_to_edn(v)); } - Edn::Map(ys) + Edn::from(ys) } } } /// option for "add colon to keyword" -pub fn edn_to_json(data: Edn, add_colon: bool) -> Result { +pub fn edn_to_json(data: &Edn, add_colon: bool) -> Result { match data { Edn::Nil => Ok(Value::Null), - Edn::Bool(b) => Ok(Value::Bool(b)), - Edn::Number(n) => match serde_json::value::Number::from_f64(n) { + Edn::Bool(b) => Ok(Value::Bool(*b)), + Edn::Number(n) => match serde_json::value::Number::from_f64(*n) { Some(v) => Ok(Value::Number(v)), None => Err(format!("failed to convert to number: {n}")), }, @@ -53,7 +53,7 @@ pub fn edn_to_json(data: Edn, add_colon: bool) -> Result { if add_colon { Ok(Value::String(format!(":{s}"))) } else { - Ok(Value::String((*s.to_str()).to_string())) + Ok(Value::String((*s.ref_str()).to_string())) } } Edn::Str(s) => Ok(Value::String((*s).to_string())), @@ -66,7 +66,7 @@ pub fn edn_to_json(data: Edn, add_colon: bool) -> Result { } Edn::Map(xs) => { let mut data = serde_json::Map::new(); - for (k, v) in xs { + for (k, v) in &xs.0 { match k { Edn::Str(s) => { data.insert(s.to_string(), edn_to_json(v, add_colon)?); @@ -84,10 +84,10 @@ pub fn edn_to_json(data: Edn, add_colon: bool) -> Result { Ok(Value::Object(data)) } - Edn::Record(_, entries) => { + Edn::Record(EdnRecordView { pairs: entries, .. }) => { let mut data = serde_json::Map::new(); for entry in entries { - data.insert(entry.0.to_string(), edn_to_json(entry.1.to_owned(), add_colon)?); + data.insert(entry.0.to_string(), edn_to_json(&entry.1, add_colon)?); } Ok(Value::Object(data)) } @@ -116,14 +116,14 @@ pub fn stringify_json(args: Vec) -> Result { if args.len() == 2 { match &args[1] { Edn::Bool(add_colon) => { - let ret = edn_to_json(args[0].to_owned(), *add_colon)?; + let ret = edn_to_json(&args[0], *add_colon)?; match serde_json::to_string(&ret) { Ok(s) => Ok(Edn::Str(s.into())), Err(e) => Err(format!("failed to generate string: {e}")), } } Edn::Nil => { - let ret = edn_to_json(args[0].to_owned(), false)?; + let ret = edn_to_json(&args[0], false)?; match serde_json::to_string(&ret) { Ok(s) => Ok(Edn::Str(s.into())), Err(e) => Err(format!("failed to generate string: {e}")), diff --git a/src/process.rs b/src/process.rs index 8bec53e..c553134 100644 --- a/src/process.rs +++ b/src/process.rs @@ -9,7 +9,7 @@ pub fn execute_command(args: Vec) -> Result { let mut cmd = String::from(""); let mut xs: Vec = vec![]; - for (idx, piece) in ys.iter().enumerate() { + for (idx, piece) in ys.0.iter().enumerate() { if let Edn::Str(s) = piece { if idx == 0 { cmd = (**s).to_owned(); @@ -25,7 +25,7 @@ pub fn execute_command(args: Vec) -> Result { Ok(t) => { let content = String::from_utf8(t.stdout).unwrap(); let stderr = String::from_utf8(t.stderr).unwrap(); - Ok(Edn::List(vec![Edn::Str(content.into()), Edn::Str(stderr.into())])) + Ok(Edn::from(vec![Edn::Str(content.into()), Edn::Str(stderr.into())])) } Err(e) => Err(format!("Failed to excute: {e}")), }