62 lines
1.8 KiB
Rust
Raw Normal View History

use cfgsync_adapter::{
DynCfgsyncError, MaterializationResult, MaterializedArtifacts, RegistrationSnapshot,
RegistrationSnapshotMaterializer,
};
use cfgsync_artifacts::{ArtifactFile, ArtifactSet};
2026-03-12 09:45:13 +01:00
use cfgsync_core::NodeRegistration;
use cfgsync_runtime::{Client, OutputMap, serve};
2026-03-12 09:45:13 +01:00
use tempfile::tempdir;
use tokio::time::{Duration, sleep};
struct ExampleMaterializer;
impl RegistrationSnapshotMaterializer for ExampleMaterializer {
fn materialize_snapshot(
&self,
registrations: &RegistrationSnapshot,
) -> Result<MaterializationResult, DynCfgsyncError> {
if registrations.is_empty() {
return Ok(MaterializationResult::NotReady);
}
let nodes = registrations.iter().map(|registration| {
(
registration.identifier.clone(),
ArtifactSet::new(vec![ArtifactFile::new(
"/config.yaml".to_string(),
format!("id: {}\n", registration.identifier),
)]),
)
});
Ok(MaterializationResult::ready(
MaterializedArtifacts::from_nodes(nodes),
))
}
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
2026-03-12 09:45:13 +01:00
let port = 4400;
2026-03-12 09:51:03 +01:00
let server = tokio::spawn(async move { serve(port, ExampleMaterializer).await });
2026-03-12 09:45:13 +01:00
// Give the server a moment to bind before the client registers.
sleep(Duration::from_millis(100)).await;
let tempdir = tempdir()?;
let outputs = OutputMap::under(tempdir.path().to_path_buf());
let registration = NodeRegistration::new("node-1".to_string(), "127.0.0.1".parse()?);
2026-03-12 09:45:13 +01:00
Client::new("http://127.0.0.1:4400")
.fetch_and_write(&registration, &outputs)
.await?;
2026-03-12 09:45:13 +01:00
2026-03-12 10:03:02 +01:00
println!(
"{}",
std::fs::read_to_string(tempdir.path().join("config.yaml"))?
);
2026-03-12 09:45:13 +01:00
server.abort();
Ok(())
}