From 6fa1b27f08afb8e8ec81f36ddfff69a23c2d73d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Kot?= Date: Sat, 31 Jul 2021 21:42:49 +0200 Subject: Add custom_format example --- examples/custom_format/main.rs | 55 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 examples/custom_format/main.rs (limited to 'examples') diff --git a/examples/custom_format/main.rs b/examples/custom_format/main.rs new file mode 100644 index 0000000..981dcb4 --- /dev/null +++ b/examples/custom_format/main.rs @@ -0,0 +1,55 @@ +use std::collections::HashMap; + +use config::{Config, File, FileExtensions, Format, Value, ValueKind}; + +fn main() { + let config = Config::builder() + .add_source(File::from_str("bad", MyFormat)) + .add_source(File::from_str("good", MyFormat)) + .build(); + + match config { + Ok(cfg) => println!("A config: {:#?}", cfg), + Err(e) => println!("An error: {}", e), + } +} + +#[derive(Debug, Clone)] +pub struct MyFormat; + +impl Format for MyFormat { + fn parse( + &self, + uri: Option<&String>, + text: &str, + ) -> Result< + std::collections::HashMap, + Box, + > { + // Let's assume our format is somewhat crippled, but this is fine + // In real life anything can be used here - nom, serde or other. + // + // For some more real-life examples refer to format implementation within the library code + let mut result = HashMap::new(); + + if text == "good" { + result.insert( + "key".to_string(), + Value::new(uri, ValueKind::String(text.into())), + ); + } else { + println!("Something went wrong in {:?}", uri); + } + + Ok(result) + } +} + +// As crazy as it seems for config sourced from a string, legacy demands its sacrifice +// It is only required for File source, custom sources can use Format without caring for extensions +static MY_FORMAT_EXT: Vec<&'static str> = vec![]; +impl FileExtensions for MyFormat { + fn extensions(&self) -> &Vec<&'static str> { + &MY_FORMAT_EXT + } +} -- cgit v1.2.3