shield_credentials/
method.rs1use std::sync::Arc;
2
3use async_trait::async_trait;
4use serde::de::DeserializeOwned;
5use shield::{Action, Method, ShieldError, User, erased_method};
6
7use crate::{
8 actions::{CredentialsSignInAction, CredentialsSignOutAction},
9 credentials::Credentials,
10 provider::CredentialsProvider,
11};
12
13pub const CREDENTIALS_METHOD_ID: &str = "credentials";
14
15pub struct CredentialsMethod<U: User, D: DeserializeOwned> {
16 credentials: Arc<dyn Credentials<U, D>>,
17}
18
19impl<U: User, D: DeserializeOwned> CredentialsMethod<U, D> {
20 pub fn new<C: Credentials<U, D> + 'static>(credentials: C) -> Self {
21 Self {
22 credentials: Arc::new(credentials),
23 }
24 }
25}
26
27#[async_trait]
28impl<U: User + 'static, D: DeserializeOwned + 'static> Method for CredentialsMethod<U, D> {
29 type Provider = CredentialsProvider;
30 type Session = ();
31
32 fn id(&self) -> String {
33 CREDENTIALS_METHOD_ID.to_owned()
34 }
35
36 fn actions(&self) -> Vec<Box<dyn Action<Self::Provider, Self::Session>>> {
37 vec![
38 Box::new(CredentialsSignInAction::new(self.credentials.clone())),
39 Box::new(CredentialsSignOutAction),
40 ]
41 }
42
43 async fn providers(&self) -> Result<Vec<Self::Provider>, ShieldError> {
44 Ok(vec![CredentialsProvider])
45 }
46}
47
48erased_method!(CredentialsMethod, <U: User, D: DeserializeOwned>);