From 0dc3a6c0f6ab15b767208a2bbee415cc4a0962c0 Mon Sep 17 00:00:00 2001 From: zekroTJA Date: Wed, 15 Jul 2026 22:20:36 +0200 Subject: [PATCH] init --- .gitignore | 1 + 01-problem/Cargo.toml | 6 ++++ 01-problem/src/main.rs | 39 ++++++++++++++++++++++++ 02-runtime-check/Cargo.toml | 6 ++++ 02-runtime-check/src/main.rs | 55 ++++++++++++++++++++++++++++++++++ 03-builder-pattern/Cargo.toml | 6 ++++ 03-builder-pattern/src/main.rs | 49 ++++++++++++++++++++++++++++++ 04-typestate/Cargo.toml | 6 ++++ 04-typestate/src/main.rs | 54 +++++++++++++++++++++++++++++++++ Cargo.lock | 19 ++++++++++++ Cargo.toml | 2 ++ 11 files changed, 243 insertions(+) create mode 100644 .gitignore create mode 100644 01-problem/Cargo.toml create mode 100644 01-problem/src/main.rs create mode 100644 02-runtime-check/Cargo.toml create mode 100644 02-runtime-check/src/main.rs create mode 100644 03-builder-pattern/Cargo.toml create mode 100644 03-builder-pattern/src/main.rs create mode 100644 04-typestate/Cargo.toml create mode 100644 04-typestate/src/main.rs create mode 100644 Cargo.lock create mode 100644 Cargo.toml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/01-problem/Cargo.toml b/01-problem/Cargo.toml new file mode 100644 index 0000000..ae27eb7 --- /dev/null +++ b/01-problem/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "problem" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/01-problem/src/main.rs b/01-problem/src/main.rs new file mode 100644 index 0000000..d8930c9 --- /dev/null +++ b/01-problem/src/main.rs @@ -0,0 +1,39 @@ +#![allow(unused)] + +use std::collections::HashMap; + +struct CredentialManager { + entries: HashMap, +} + +impl CredentialManager { + pub fn new() -> CredentialManager { + CredentialManager { + entries: HashMap::new(), + } + } + + pub fn unlock(&self, master_secret: &str) { + todo!() + } + + pub fn set(&mut self, key: &str, secret: &str) { + todo!() + } + + pub fn get(&mut self, key: &str) -> Option<&str> { + todo!() + } + + pub fn lock(&self) { + todo!() + } +} + +fn main() { + let mut pw = CredentialManager::new(); + pw.unlock("pssst"); + pw.set("foo", "bar"); + let val = pw.get("foo"); + pw.lock(); +} diff --git a/02-runtime-check/Cargo.toml b/02-runtime-check/Cargo.toml new file mode 100644 index 0000000..f12147d --- /dev/null +++ b/02-runtime-check/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "runtime-check" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/02-runtime-check/src/main.rs b/02-runtime-check/src/main.rs new file mode 100644 index 0000000..bf9cd4b --- /dev/null +++ b/02-runtime-check/src/main.rs @@ -0,0 +1,55 @@ +#![allow(unused)] + +use std::collections::HashMap; + +struct CredentialManager { + locked: bool, + entries: HashMap, +} + +impl CredentialManager { + pub fn new() -> CredentialManager { + CredentialManager { + locked: false, + entries: HashMap::new(), + } + } + + pub fn unlock(&self, master_secret: &str) -> Result<(), &'static str> { + if !self.locked { + return Err("already unlocked"); + } + todo!() + } + + pub fn set(&mut self, key: &str, secret: &str) -> Result<(), &'static str> { + if self.locked { + return Err("locked"); + } + todo!() + } + + pub fn get(&mut self, key: &str) -> Result, &'static str> { + if self.locked { + return Err("locked"); + } + todo!() + } + + pub fn lock(&self) -> Result<(), &'static str> { + if self.locked { + return Err("already locked"); + } + todo!() + } +} + +fn main() -> Result<(), &'static str> { + let mut pw = CredentialManager::new(); + pw.unlock("pssst")?; + pw.set("foo", "bar")?; + let val = pw.get("foo")?; + pw.lock()?; + + Ok(()) +} diff --git a/03-builder-pattern/Cargo.toml b/03-builder-pattern/Cargo.toml new file mode 100644 index 0000000..184bcd9 --- /dev/null +++ b/03-builder-pattern/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "builder-pattern" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/03-builder-pattern/src/main.rs b/03-builder-pattern/src/main.rs new file mode 100644 index 0000000..52b4f6f --- /dev/null +++ b/03-builder-pattern/src/main.rs @@ -0,0 +1,49 @@ +#![allow(unused)] + +use std::collections::HashMap; + +struct LockedCredentialManager { + entries: HashMap, +} + +struct UnlockedCredentialManager { + entries: HashMap, +} + +impl LockedCredentialManager { + pub fn new() -> LockedCredentialManager { + LockedCredentialManager { + entries: HashMap::new(), + } + } + + pub fn unlock(self, master_secret: &str) -> UnlockedCredentialManager { + UnlockedCredentialManager { + entries: self.entries, + } + } +} + +impl UnlockedCredentialManager { + pub fn set(&mut self, key: &str, secret: &str) { + todo!() + } + + pub fn get(&mut self, key: &str) -> Option<&str> { + todo!() + } + + pub fn lock(self) -> LockedCredentialManager { + LockedCredentialManager { + entries: self.entries, + } + } +} + +fn main() { + let pw = LockedCredentialManager::new(); + let mut pw = pw.unlock("pssst"); + pw.set("foo", "bar"); + let val = pw.get("foo"); + pw.lock(); +} diff --git a/04-typestate/Cargo.toml b/04-typestate/Cargo.toml new file mode 100644 index 0000000..db69ef6 --- /dev/null +++ b/04-typestate/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "typestate" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/04-typestate/src/main.rs b/04-typestate/src/main.rs new file mode 100644 index 0000000..dd25450 --- /dev/null +++ b/04-typestate/src/main.rs @@ -0,0 +1,54 @@ +#![allow(unused)] + +use std::collections::HashMap; + +struct Locked; +struct Unlocked; + +struct CredentialManager { + entries: HashMap, + state: std::marker::PhantomData, +} + +impl CredentialManager { + pub fn new() -> CredentialManager { + CredentialManager { + entries: HashMap::new(), + state: std::marker::PhantomData, + } + } +} + +impl CredentialManager { + pub fn unlock(self, master_secret: &str) -> CredentialManager { + CredentialManager { + entries: self.entries, + state: std::marker::PhantomData, + } + } +} + +impl CredentialManager { + pub fn set(&mut self, key: &str, secret: &str) { + todo!() + } + + pub fn get(&mut self, key: &str) -> Option<&str> { + todo!() + } + + pub fn lock(self) -> CredentialManager { + CredentialManager { + entries: self.entries, + state: std::marker::PhantomData, + } + } +} + +fn main() { + let pw = CredentialManager::new(); + let mut pw = pw.unlock("pssst"); + pw.set("foo", "bar"); + let val = pw.get("foo"); + pw.lock(); +} diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..a2c2324 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,19 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "builder-pattern" +version = "0.1.0" + +[[package]] +name = "problem" +version = "0.1.0" + +[[package]] +name = "runtime-check" +version = "0.1.0" + +[[package]] +name = "typestate" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..222e172 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,2 @@ +[workspace] +members = ["01-problem", "02-runtime-check", "03-builder-pattern", "04-typestate"]