Skip to content

Commit 520d61d

Browse files
committed
impl from_map
1 parent 6fb5d3a commit 520d61d

File tree

1 file changed

+18
-9
lines changed
  • tailcall-template/src/jq

1 file changed

+18
-9
lines changed

tailcall-template/src/jq/jq.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,37 @@
11
use jaq_core::ValR;
22

3-
use crate::jsonlike::JsonLike;
3+
use crate::jsonlike::{JsonLike, JsonObjectLike};
44

55
#[derive(Clone, PartialEq, PartialOrd)]
6-
pub struct JsonLikeHelper<A>
7-
where
8-
A: for<'a> JsonLike<'a>,
9-
{
10-
pub data: A,
11-
}
6+
pub struct JsonLikeHelper<A: for<'a> JsonLike<'a>>(pub A);
127

138
impl<A> jaq_core::ValT for JsonLikeHelper<A>
149
where
1510
A: for<'a> JsonLike<'a> + Clone + PartialEq + PartialOrd,
1611
{
1712
fn from_num(n: &str) -> ValR<Self> {
1813
match n.parse::<f64>() {
19-
Ok(num) => ValR::Ok(JsonLikeHelper { data: A::number_f64(num) }),
14+
Ok(num) => ValR::Ok(JsonLikeHelper(A::number_f64(num))),
2015
Err(err) => ValR::Err(jaq_core::Error::str(format!("Invalid number format: {}", err.to_string()))),
2116
}
2217
}
2318

2419
fn from_map<I: IntoIterator<Item = (Self, Self)>>(iter: I) -> ValR<Self> {
25-
todo!()
20+
iter.into_iter().fold(ValR::Ok(Self(JsonLike::object(JsonObjectLike::new()))), |acc, (key, value)| {
21+
let key = match JsonLike::as_str(&key.0) {
22+
Some(key) => key,
23+
None => return ValR::Err(jaq_core::Error::str("The value cannot be converted to String")),
24+
};
25+
26+
match acc {
27+
Ok(mut acc) => {
28+
let acc_mut = JsonLike::as_object_mut(&mut acc.0).unwrap();
29+
acc_mut.insert_key(key, value.0);
30+
ValR::Ok(acc)
31+
},
32+
Err(err) => ValR::Err(err),
33+
}
34+
})
2635
}
2736

2837
fn values(self) -> Box<dyn Iterator<Item = ValR<Self>>> {

0 commit comments

Comments
 (0)