diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index b86ecc4..9297e8b 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -2,32 +2,35 @@ name: Rust
on:
push:
- branches: [ "release" ]
+ branches: ["release"]
pull_request:
- branches: [ "release" ]
+ branches: ["release"]
env:
CARGO_TERM_COLOR: always
jobs:
- build:
-
+ publish:
runs-on: ubuntu-latest
steps:
- - name: Setup Rust Toolchain for GitHub CI
- uses: actions-rust-lang/setup-rust-toolchain@v1.6.0
-
- - uses: actions/checkout@v3
- - name: Run clippy
- run: cargo clippy --all-features --all-targets -- -D warnings
- - name: Build
- run: cargo build --verbose
- - name: Run tests
- run: cargo test --verbose
+ - name: toolchain
+ uses: actions-rs/toolchain@v1
+ with:
+ profile: minimal
+ toolchain: stable
+ components: clippy
+
+ - uses: actions/checkout@v3
+ - name: Run clippy
+ run: cargo clippy --all-features --all-targets -- -D warnings
+ - name: Build
+ run: cargo build --verbose
+ - name: Run tests
+ run: cargo test --verbose
- - name: publish crates
- uses: katyo/publish-crates@v2
- with:
- # Cargo registry token
- registry-token: ${{secrets.crates_io}}
+ - name: publish crates
+ uses: katyo/publish-crates@v2
+ with:
+ # Cargo registry token
+ registry-token: ${{secrets.crates_io}}
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 79c46b6..b8d353e 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -2,27 +2,30 @@ name: Rust
on:
push:
- branches: [ "dev" ]
+ branches: ["dev"]
pull_request:
- branches: [ "dev" ]
+ branches: ["dev"]
env:
CARGO_TERM_COLOR: always
jobs:
- build:
-
+ test:
runs-on: ubuntu-latest
steps:
- - name: Setup Rust Toolchain for GitHub CI
- uses: actions-rust-lang/setup-rust-toolchain@v1.6.0
-
- - uses: actions/checkout@v3
-
- - name: Run clippy
- run: cargo clippy --all-features --all-targets -- -D warnings
- - name: Build
- run: cargo build --verbose
- - name: Run tests
- run: cargo test --verbose
+ - name: toolchain
+ uses: actions-rs/toolchain@v1
+ with:
+ profile: minimal
+ toolchain: stable
+ components: clippy
+
+ - uses: actions/checkout@v3
+
+ - name: Run clippy
+ run: cargo clippy --all-features --all-targets -- -D warnings
+ - name: Build
+ run: cargo build --verbose
+ - name: Run tests
+ run: cargo test --verbose
diff --git a/README.md b/README.md
index b368f20..2fffa25 100644
--- a/README.md
+++ b/README.md
@@ -87,7 +87,7 @@ A rust crate to manage, persist, encrypt configurations.
## Getting Started
-Details here: [Example](tests/tests.rs)
+Details here: [Example](example/eamples.rs)
(back to top)
diff --git a/tests/tests.rs b/examples/example.rs
similarity index 97%
rename from tests/tests.rs
rename to examples/example.rs
index 63fc0c5..29d7507 100644
--- a/tests/tests.rs
+++ b/examples/example.rs
@@ -50,8 +50,7 @@ impl SecretSource for SecretSourceImpl {
}
}
-#[test]
-fn source_test() {
+fn config_tests() {
let mut config = Config::new("test");
config.add_source(NormalSource).unwrap();
config.add_persist_source(PersistSourceImpl).unwrap();
@@ -79,3 +78,7 @@ fn source_test() {
std::fs::remove_file("tests/secret_test").unwrap();
std::fs::remove_file("tests/test").unwrap();
}
+
+fn main() {
+ config_tests();
+}
diff --git a/src/config.rs b/src/config.rs
index 7bc9602..02387ec 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -10,7 +10,7 @@ pub(crate) type ConfigValue = Vec;
/// A struct that can be used to store configuration values.
/// # Example
-/// ```
+/// ```no_run
/// use encrypt_config::{Config, Source, ConfigResult};
///
/// let mut config = Config::new("test");
@@ -92,7 +92,7 @@ impl Config {
/// You can get a `ConfigPatch` by calling [`PersistSource::upgrade`], and apply it by calling [`ConfigPatch::apply`] to a config.
/// No change will happen until you call [`ConfigPatch::apply`].
/// # Example
-/// ```rust
+/// ```no_run
/// use encrypt_config::{Config, ConfigKey, PersistSource, ConfigResult};
///
/// let mut config = Config::new("test");
@@ -144,11 +144,13 @@ impl ConfigPatch {
}
}
+type Func = Box ConfigResult>;
+
/// A patch that can be used to modify the config.
/// You can get a `SecretConfigPatch` by calling [`SecretSource::upgrade`], and apply it by calling [`SecretConfigPatch::apply`] to a config.
/// No change will happen until you call [`SecretConfigPatch::apply`].
/// # Example
-/// ```rust
+/// ```no_run
/// use encrypt_config::{Config, ConfigKey, SecretSource, ConfigResult};
///
/// let mut config = Config::new("test");
@@ -184,14 +186,11 @@ impl ConfigPatch {
/// ```
pub struct SecretConfigPatch {
key: ConfigKey,
- func: Box ConfigResult>,
+ func: Func,
}
impl SecretConfigPatch {
- pub(crate) fn new(
- key: ConfigKey,
- func: Box ConfigResult>>,
- ) -> Self {
+ pub(crate) fn new(key: ConfigKey, func: Func) -> Self {
Self { key, func }
}
diff --git a/src/lib.rs b/src/lib.rs
index 8bebe28..681587f 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -107,10 +107,95 @@ pub trait SecretSource {
let new_value = serde_json::to_vec(new_value).unwrap();
let func = Box::new(move |encrypter: &Encrypter| {
let encrypted = encrypter.encrypt_serded(&new_value).unwrap();
- std::fs::write(path, &encrypted).unwrap();
+ std::fs::write(path, encrypted).unwrap();
Ok(new_value)
});
let patch = SecretConfigPatch::new(self.source_name(), func);
Ok(patch)
}
}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ struct NormalSource;
+ impl Source for NormalSource {
+ type Value = String;
+ type Map = Vec<(String, Self::Value)>;
+
+ fn collect(&self) -> ConfigResult {
+ Ok(vec![("key".to_owned(), "value".to_owned())])
+ }
+ }
+
+ #[derive(serde::Serialize, serde::Deserialize, Debug, PartialEq)]
+ struct Foo(String);
+
+ struct PersistSourceImpl;
+ impl PersistSource for PersistSourceImpl {
+ type Value = Foo;
+
+ fn source_name(&self) -> ConfigKey {
+ "test".to_owned()
+ }
+
+ fn default(&self) -> Self::Value {
+ Foo("hello".to_owned())
+ }
+
+ fn path(&self) -> std::path::PathBuf {
+ std::path::PathBuf::from("tests").join(self.source_name())
+ }
+ }
+
+ #[derive(serde::Serialize, serde::Deserialize, Debug, PartialEq)]
+ struct Bar(String);
+
+ struct SecretSourceImpl;
+ impl SecretSource for SecretSourceImpl {
+ type Value = Bar;
+
+ fn source_name(&self) -> ConfigKey {
+ "secret_test".to_owned()
+ }
+
+ fn default(&self) -> Self::Value {
+ Bar("world".to_owned())
+ }
+
+ fn path(&self) -> std::path::PathBuf {
+ std::path::PathBuf::from("tests").join(self.source_name())
+ }
+ }
+
+ #[test]
+ fn config_tests() {
+ let mut config = Config::new("test");
+ config.add_source(NormalSource).unwrap();
+ config.add_persist_source(PersistSourceImpl).unwrap();
+ config.add_secret_source(SecretSourceImpl).unwrap();
+ let v: String = config.get("key").unwrap();
+ assert_eq!(v, "value");
+ let v: Foo = config.get("test").unwrap();
+ assert_eq!(v, Foo("hello".to_owned()));
+ let v: Bar = config.get("secret_test").unwrap();
+ assert_eq!(v, Bar("world".to_owned()));
+ let patch = NormalSource
+ .upgrade("key", &"new_value".to_owned())
+ .unwrap();
+ patch.apply(&mut config).unwrap();
+ let v: String = config.get("key").unwrap();
+ assert_eq!(v, "new_value");
+ let patch = PersistSourceImpl.upgrade(&Foo("hi".to_owned())).unwrap();
+ patch.apply(&mut config).unwrap();
+ let v: Foo = config.get("test").unwrap();
+ assert_eq!(v, Foo("hi".to_owned()));
+ let patch = SecretSourceImpl.upgrade(&Bar("Louis".to_owned())).unwrap();
+ patch.apply(&mut config).unwrap();
+ let v: Bar = config.get("secret_test").unwrap();
+ assert_eq!(v, Bar("Louis".to_owned()));
+ std::fs::remove_file("tests/secret_test").unwrap();
+ std::fs::remove_file("tests/test").unwrap();
+ }
+}
diff --git a/tests/.gitkeep b/tests/.gitkeep
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/tests/.gitkeep
@@ -0,0 +1 @@
+