use super::register::Module;
use crate::agent::agents::Agent;
use async_trait::async_trait;
use clap::ArgMatches;
use serde::Deserialize;
use serde_json::Value;
pub struct SchemaConfig {
pub name: String,
pub version: String,
pub attributes: Vec<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Schema {
pub sent: SchemaSent,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SchemaSent {
pub schema: Value,
pub schema_id: String,
}
pub struct SchemaModule;
#[async_trait(?Send)]
impl Module<SchemaConfig> for SchemaModule {
async fn run(agent: &dyn Agent, config: SchemaConfig) {
let schema = agent.schema(&config).await;
agent.logger().log(&schema.sent.schema_id);
}
async fn register<'a>(agent: &dyn Agent, matches: &ArgMatches<'a>) {
if let Some(matches_schema) = matches.subcommand_matches("schema") {
let name = matches_schema.value_of("name").unwrap().to_string();
let version = matches_schema
.value_of("schema-version")
.unwrap_or("1.0")
.to_string();
let attributes: Vec<String> = matches_schema
.values_of("attribute")
.unwrap()
.map(|x| x.to_string())
.collect();
let config = SchemaConfig {
name,
version,
attributes,
};
SchemaModule::run(agent, config).await;
}
}
}