diff options
author | Justus Winter <justus@pep-project.org> | 2017-12-12 17:16:00 +0100 |
---|---|---|
committer | Justus Winter <justus@pep-project.org> | 2017-12-13 13:55:20 +0100 |
commit | c86ad83ae31d44aeab3317e5e05d6d63e428f0e0 (patch) | |
tree | 12d1aac77f256e733104e98faf9143152eacd573 /core | |
parent | c0cab61441df7a0334f817c2cc4817a0910e1193 (diff) |
Split up Sequoia.
- Split up into six crates: buffered-reader, openpgp, sequoia-core,
sequoia-ffi, sequoia-net, and sequoia-store.
- Adjust imports accordingly.
Diffstat (limited to 'core')
-rw-r--r-- | core/Cargo.toml | 6 | ||||
-rw-r--r-- | core/src/lib.rs | 103 |
2 files changed, 109 insertions, 0 deletions
diff --git a/core/Cargo.toml b/core/Cargo.toml new file mode 100644 index 00000000..034cc2fd --- /dev/null +++ b/core/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "sequoia-core" +version = "0.1.0" +authors = ["Justus Winter <justus@pep-project.org>"] + +[dependencies] diff --git a/core/src/lib.rs b/core/src/lib.rs new file mode 100644 index 00000000..efddaa0b --- /dev/null +++ b/core/src/lib.rs @@ -0,0 +1,103 @@ +//! Core functionality. + +use std::env; +use std::fs; +use std::io; +use std::path::{Path, PathBuf}; + +/// A `&Context` is required for many operations. +/// +/// # Example +/// +/// ``` +/// # use sequoia_core::Context; +/// let c = Context::new("org.example.webmail").unwrap(); +/// ``` +pub struct Context { + domain: String, + home: PathBuf, + lib: PathBuf, +} + +fn prefix() -> PathBuf { + /* XXX: Windows support. */ + PathBuf::from(option_env!("PREFIX").or(Some("/usr/local")).unwrap()) +} + +impl Context { + /// Creates a Context with reasonable defaults. + /// + /// `domain` should uniquely identify your application, it is + /// strongly suggested to use a reversed fully qualified domain + /// name that is associated with your application. + pub fn new(domain: &str) -> io::Result<Self> { + Self::configure(domain).build() + } + + /// Creates a Context that can be configured. + /// + /// `domain` should uniquely identify your application, it is + /// strongly suggested to use a reversed fully qualified domain + /// name that is associated with your application. + /// + /// The configuration is seeded like in `Context::new`, but can be + /// modified. A configuration has to be finalized using + /// `.build()` in order to turn it into a Context. + pub fn configure(domain: &str) -> Config { + Config(Context { + domain: String::from(domain), + home: env::home_dir().unwrap_or(env::temp_dir()) + .join(".sequoia"), + lib: prefix().join("lib").join("sequoia"), + }) + } + + /// Returns the domain of the context. + pub fn domain(&self) -> &str { + &self.domain + } + + /// Returns the directory containing shared state. + pub fn home(&self) -> &Path { + &self.home + } + + /// Returns the directory containing backend servers. + pub fn lib(&self) -> &Path { + &self.lib + } +} + +/// Represents a `Context` configuration. +pub struct Config(Context); + +impl Config { + /// Finalizes the configuration and return a `Context`. + pub fn build(self) -> io::Result<Context> { + let c = self.0; + fs::create_dir_all(c.home())?; + Ok(c) + } + + /// Sets the directory containing shared state. + pub fn home<P: AsRef<Path>>(mut self, home: P) -> Self { + self.set_home(home); + self + } + + /// Sets the directory containing shared state. + pub fn set_home<P: AsRef<Path>>(&mut self, home: P) { + self.0.home = PathBuf::new().join(home); + } + + /// Set the directory containing backend servers. + pub fn lib<P: AsRef<Path>>(mut self, lib: P) -> Self { + self.set_lib(lib); + self + } + + /// Sets the directory containing shared state. + pub fn set_lib<P: AsRef<Path>>(&mut self, lib: P) { + self.0.lib = PathBuf::new().join(lib); + } +} |