use crate::wami::identity::User;
use async_trait::async_trait;
use wami_core::error::Result;
use wami_core::types::{PaginationParams, Tag};
#[async_trait]
pub trait UserStore: Send + Sync {
async fn create_user(&mut self, user: User) -> Result<User>;
async fn get_user(&self, user_name: &str) -> Result<Option<User>>;
async fn update_user(&mut self, user: User) -> Result<User>;
async fn delete_user(&mut self, user_name: &str) -> Result<()>;
async fn list_users(
&self,
path_prefix: Option<&str>,
pagination: Option<&PaginationParams>,
) -> Result<(Vec<User>, bool, Option<String>)>;
async fn tag_user(&mut self, user_name: &str, tags: Vec<Tag>) -> Result<()>;
async fn list_user_tags(&self, user_name: &str) -> Result<Vec<Tag>>;
async fn untag_user(&mut self, user_name: &str, tag_keys: Vec<String>) -> Result<()>;
async fn attach_user_policy(&mut self, user_name: &str, policy_arn: &str) -> Result<()>;
async fn detach_user_policy(&mut self, user_name: &str, policy_arn: &str) -> Result<()>;
async fn list_attached_user_policies(&self, user_name: &str) -> Result<Vec<String>>;
async fn put_user_policy(
&mut self,
user_name: &str,
policy_name: &str,
policy_document: String,
) -> Result<()>;
async fn get_user_policy(&self, user_name: &str, policy_name: &str) -> Result<Option<String>>;
async fn delete_user_policy(&mut self, user_name: &str, policy_name: &str) -> Result<()>;
async fn list_user_policies(&self, user_name: &str) -> Result<Vec<String>>;
}