use std::future::Future;
use crate::hashing::{KeyVersion, LookupKey};
use crate::state::TokenConsumeOutcome;
use super::error::StoreError;
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TokenSubject {
Anonymous,
Authenticated(crate::secret::SubjectId),
Flow(crate::secret::CodeId),
}
impl TokenSubject {
#[must_use]
pub fn as_binding_str(&self) -> String {
match self {
TokenSubject::Anonymous => "anon".to_string(),
TokenSubject::Authenticated(s) => format!("auth:{}", s.as_str()),
TokenSubject::Flow(f) => format!("flow:{}", f.as_str()),
}
}
}
#[derive(Debug, Clone)]
pub struct ConsumedTokenRecord {
pub consumed: bool,
pub result_ref: Option<String>,
pub binding_ok: bool,
}
pub struct FormTokenRecord {
pub lookup_key: LookupKey,
pub key_version: KeyVersion,
pub subject: TokenSubject,
pub purpose: String,
pub bound_resource: Option<String>,
pub issued_at: u64,
pub expires_at: u64,
}
pub trait FormTokenStore {
fn insert_form_token(
&self,
record: FormTokenRecord,
) -> impl Future<Output = Result<(), StoreError>>;
fn consume_form_token(
&self,
lookup_key: &LookupKey,
subject: &TokenSubject,
purpose: &str,
bound_resource: Option<&str>,
now: u64,
) -> impl Future<Output = Result<(TokenConsumeOutcome, Option<String>), StoreError>>;
fn set_token_result(
&self,
lookup_key: &LookupKey,
result_ref: &str,
) -> impl Future<Output = Result<(), StoreError>>;
}