id_effect_platform 0.4.0

Platform capability traits (HTTP, FS, process) for id_effect — @effect/platform-style boundaries
Documentation
use id_effect::run_blocking;
use id_effect_platform::auth::{MemoryOAuthClient, OAuthClient, OAuthError, OAuthUserInfo};

#[test]
fn memory_client_authorization_url_contains_state() {
  let client = MemoryOAuthClient::new("https://idp.test");
  let url = client.authorization_url("state123");
  assert!(url.contains("state123"));
}

#[test]
fn memory_client_exchange_registered_code() {
  let client = MemoryOAuthClient::new("https://idp.test");
  client.register_code(
    "code-1",
    OAuthUserInfo {
      sub: "u1".into(),
      email: Some("a@b.c".into()),
    },
  );
  let (tokens, user) = run_blocking(client.exchange_code("code-1"), ()).expect("exchange");
  assert!(!tokens.access_token.is_empty());
  assert_eq!(user.sub, "u1");
}

#[test]
fn memory_client_rejects_unknown_code() {
  let client = MemoryOAuthClient::new("https://idp.test");
  let err = run_blocking(client.exchange_code("nope"), ()).unwrap_err();
  assert!(matches!(err, OAuthError::InvalidCode));
}