Skip to main content

shield_credentials/
method.rs

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