summaryrefslogtreecommitdiffstats
path: root/src/file/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/file/mod.rs')
-rw-r--r--src/file/mod.rs75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/file/mod.rs b/src/file/mod.rs
new file mode 100644
index 0000000..7534ddb
--- /dev/null
+++ b/src/file/mod.rs
@@ -0,0 +1,75 @@
+mod format;
+pub mod source;
+
+use source::Source;
+use error::*;
+use value::Value;
+
+use self::source::FileSource;
+pub use self::format::FileFormat;
+
+pub struct File<T>
+ where T: FileSource
+{
+ source: T,
+
+ /// Namespace to restrict configuration from the file
+ namespace: Option<String>,
+
+ /// Format of file (which dictates what driver to use).
+ format: Option<FileFormat>,
+
+ /// A required File will error if it cannot be found
+ required: bool,
+}
+
+impl File<source::string::FileSourceString> {
+ pub fn from_str(s: &str, format: FileFormat) -> Self {
+ File {
+ format: Some(format),
+ required: true,
+ namespace: None,
+ source: s.into(),
+ }
+ }
+}
+
+impl File<source::file::FileSourceFile> {
+ pub fn new(name: &str, format: FileFormat) -> Self {
+ File {
+ format: Some(format),
+ required: true,
+ namespace: None,
+ source: source::file::FileSourceFile::new(name),
+ }
+ }
+}
+
+impl<T: FileSource> File<T> {
+ pub fn required(&mut self, required: bool) -> &mut Self {
+ self.required = required;
+ self
+ }
+
+ pub fn namespace(&mut self, namespace: &str) -> &mut Self {
+ self.namespace = Some(namespace.into());
+ self
+ }
+}
+
+impl<T: FileSource> Source for File<T> {
+ fn collect(&self) -> Result<Value> {
+ // Coerce the file contents to a string
+ let (uri, contents) = self.source.resolve(self.format).map_err(|err| {
+ ConfigError::Foreign(err)
+ })?;
+
+ // Parse the string using the given format
+ self.format.unwrap().parse(uri.as_ref(), &contents, self.namespace.as_ref()).map_err(|cause| {
+ ConfigError::FileParse {
+ uri: uri,
+ cause: cause
+ }
+ })
+ }
+}