summaryrefslogtreecommitdiffstats
path: root/examples/custom_str_format/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/custom_str_format/main.rs')
-rw-r--r--examples/custom_str_format/main.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/examples/custom_str_format/main.rs b/examples/custom_str_format/main.rs
new file mode 100644
index 0000000..4da2e9d
--- /dev/null
+++ b/examples/custom_str_format/main.rs
@@ -0,0 +1,50 @@
+use config::{Config, File, FileStoredFormat, Format, Map, 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<Map<String, config::Value>, Box<dyn std::error::Error + Send + Sync>> {
+ // Let's assume our format is somewhat malformed, 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 = Map::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 strange 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 FileStoredFormat for MyFormat {
+ fn file_extensions(&self) -> &'static [&'static str] {
+ &MY_FORMAT_EXT
+ }
+}