use faucet_cli::registry::PluginRegistry;
use faucet_core::serde_json::{Value, json};
use faucet_core::{FaucetError, JsonSchema, Source, async_trait, schema_for};
use serde::Deserialize;
use std::collections::HashMap;
#[derive(Debug, Deserialize, JsonSchema)]
struct LoremConfig {
#[serde(default = "default_count")]
count: usize,
}
fn default_count() -> usize {
3
}
struct LoremSource {
count: usize,
}
impl LoremSource {
fn from_value(cfg: Value) -> Result<Self, FaucetError> {
let cfg: LoremConfig = faucet_core::serde_json::from_value(cfg)
.map_err(|e| FaucetError::Config(format!("invalid lorem config: {e}")))?;
Ok(Self { count: cfg.count })
}
}
#[async_trait]
impl Source for LoremSource {
async fn fetch_with_context(
&self,
_ctx: &HashMap<String, Value>,
) -> Result<Vec<Value>, FaucetError> {
Ok((0..self.count)
.map(|i| json!({ "n": i, "text": "lorem ipsum" }))
.collect())
}
fn config_schema(&self) -> Value {
faucet_core::serde_json::to_value(schema_for!(LoremConfig)).unwrap_or(Value::Null)
}
fn connector_name(&self) -> &'static str {
"lorem"
}
}
fn main() -> std::process::ExitCode {
let registry = PluginRegistry::with_builtins().register_source_with(
"lorem",
|cfg| Ok(Box::new(LoremSource::from_value(cfg)?)),
|| faucet_core::serde_json::to_value(schema_for!(LoremConfig)).unwrap_or(Value::Null),
"Toy placeholder-record source (custom-cli example)",
);
faucet_cli::run_main(registry)
}