use cano::{MemoryStore, Resource, Resources};
use cano_macros::{FromResources, Resource as ResourceDerive};
use std::sync::Arc;
#[derive(ResourceDerive)]
struct Counter {
#[allow(dead_code)]
n: u32,
}
#[derive(FromResources)]
struct SingleDep {
#[res("store")]
store: Arc<MemoryStore>,
}
#[tokio::test]
async fn single_string_key_resolves() {
let res: Resources = Resources::new().insert("store", MemoryStore::new());
let deps = SingleDep::from_resources(&res).expect("should resolve");
deps.store.put("k", 1u32).expect("put should work");
}
#[derive(FromResources)]
struct MultiDep {
#[res("store")]
store: Arc<MemoryStore>,
#[res("counter")]
counter: Arc<Counter>,
}
#[tokio::test]
async fn multiple_string_keys_resolve() {
let res: Resources = Resources::new()
.insert("store", MemoryStore::new())
.insert("counter", Counter { n: 7 });
let deps = MultiDep::from_resources(&res).expect("should resolve");
deps.store.put("x", 42u32).expect("put should work");
let _ = &deps.counter; }
#[tokio::test]
async fn missing_key_returns_error() {
let res: Resources = Resources::new(); let result = SingleDep::from_resources(&res);
assert!(result.is_err(), "should fail when key is missing");
}
#[derive(Debug, Hash, Eq, PartialEq)]
enum Key {
Store,
Counter,
}
#[derive(FromResources)]
struct EnumDep {
#[res(Key::Store)]
store: Arc<MemoryStore>,
#[res(Key::Counter)]
counter: Arc<Counter>,
}
#[tokio::test]
async fn enum_path_keys_resolve() {
let res = Resources::<Key>::new()
.insert(Key::Store, MemoryStore::new())
.insert(Key::Counter, Counter { n: 3 });
let deps = EnumDep::from_resources(&res).expect("should resolve");
deps.store.put("y", 99u32).expect("put should work");
let _ = &deps.counter;
}
#[derive(Debug, Hash, Eq, PartialEq, Clone)]
struct MyKey(String);
impl std::borrow::Borrow<str> for MyKey {
fn borrow(&self) -> &str {
&self.0
}
}
impl Resource for MyKey {}
#[derive(FromResources)]
#[from_resources(key = MyKey)]
struct OverrideDep {
#[res("store")]
store: Arc<MemoryStore>,
}
#[tokio::test]
async fn key_override_with_string_keys_resolves() {
let res = Resources::<MyKey>::new().insert(MyKey("store".to_string()), MemoryStore::new());
let deps = OverrideDep::from_resources(&res).expect("should resolve");
deps.store.put("z", 5u32).expect("put should work");
}