use argon2::{ password_hash::{rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString}, Argon2, }; use uuid::Uuid; const CREATE_QUERY: &str = "insert into witches (id, username, pwhash) values ($1, $2, $3)"; pub struct User { id: Uuid, username: String, displayname: Option, email: Option, } #[derive(Debug, Clone, sqlx::FromRow, sqlx::Encode)] struct DbUser { id: Uuid, username: String, displayname: Option, email: Option, last_seen: Option, pwhash: String, } impl From for User { fn from(dbu: DbUser) -> Self { User { id: dbu.id, username: dbu.username, displayname: dbu.displayname, email: dbu.email, } } } async fn create_user(username: &User, password: &[u8]) -> Result { // Argon2 with default params (Argon2id v19) let argon2 = Argon2::default(); let salt = SaltString::generate(&mut OsRng); let password_hash = argon2 .hash_password(password, &salt) .unwrap() // safe to unwrap, we know the salt is valid .to_string(); todo!() } #[Error(desc = "Could not create user.")] #[non_exhaustive] pub struct CreateUserError(#[from] CreateUserErrorKind); #[Error] #[non_exhaustive] pub enum CreateUserErrorKind { AlreadyExists, PasswordMismatch, MissingFields, Unknown, }