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, 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, std::io::Error> { Ok(self.item.group().keys().cloned().collect()) } async fn to_json(&self, _state: &ExtractState) -> Result { Ok(serde_json::Value::Object( self.item .group() .iter() .map(|(k, v)| { ( k.to_string(), serde_json::Value::String(format!("", v.key())), ) }) .collect(), )) } }