57 lines
1.1 KiB
Rust
57 lines
1.1 KiB
Rust
use std::sync::Arc;
|
|
|
|
use pile_config::Label;
|
|
|
|
use crate::{
|
|
extract::traits::{ExtractState, ObjectExtractor},
|
|
value::{Item, PileValue},
|
|
};
|
|
|
|
pub struct GroupExtractor {
|
|
item: Item,
|
|
}
|
|
|
|
impl GroupExtractor {
|
|
pub fn new(item: &Item) -> Self {
|
|
Self { item: item.clone() }
|
|
}
|
|
}
|
|
|
|
#[async_trait::async_trait]
|
|
impl ObjectExtractor for GroupExtractor {
|
|
async fn field(
|
|
&self,
|
|
_state: &ExtractState,
|
|
name: &Label,
|
|
args: Option<&str>,
|
|
) -> Result<Option<PileValue>, std::io::Error> {
|
|
if args.is_some() {
|
|
return Ok(None);
|
|
}
|
|
Ok(self
|
|
.item
|
|
.group()
|
|
.get(name)
|
|
.map(|item| PileValue::ObjectExtractor(Arc::new(super::ItemExtractor::new(item)))))
|
|
}
|
|
|
|
async fn fields(&self) -> Result<Vec<Label>, std::io::Error> {
|
|
Ok(self.item.group().keys().cloned().collect())
|
|
}
|
|
|
|
async fn to_json(&self, _state: &ExtractState) -> Result<serde_json::Value, std::io::Error> {
|
|
Ok(serde_json::Value::Object(
|
|
self.item
|
|
.group()
|
|
.iter()
|
|
.map(|(k, v)| {
|
|
(
|
|
k.to_string(),
|
|
serde_json::Value::String(format!("<GroupItem ({})>", v.key())),
|
|
)
|
|
})
|
|
.collect(),
|
|
))
|
|
}
|
|
}
|