
use scram_rs::scram_error::ScramResult;
use scram_rs::scram_hashing::{ScramHashing, ScramSha256};
use scram_rs::scram_auth::{ScramPassword, ScramAuthServer};
use scram_rs::scram::{ScramNonce, ScramServer};
use scram_rs::scram_common::ScramCommon;

struct AuthDB
{
}

impl AuthDB
{
    pub fn new() -> Self
    {
        return AuthDB{};
    }
}

impl ScramAuthServer<ScramSha256> for AuthDB
{
    fn get_password_for_user(&self, username: &str) -> Option<ScramPassword>
    {
        let password = "pencil";
        let salt = b"[m\x99h\x9d\x125\x8e\xec\xa0K\x14\x126\xfa\x81".to_vec();

        Some(ScramPassword::found_secret_password(
                ScramSha256::derive(password.as_bytes(), &salt, 4096).unwrap(),
                salt, 
                4096))

                
    }
}

pub fn scram_scha256() -> ScramResult<()>
{
    let authdb = AuthDB::new();
    let scramtype = ScramCommon::get_scramtype("SCRAM-SHA-256").unwrap();

    let mut server = ScramServer::<ScramSha256, AuthDB>::new(&authdb, None, ScramNonce::none(), scramtype).unwrap();

    let client_init = "n,,n=user,r=rOprNGfwEbeRWgbNEkqO";
    server.parse_response(client_init, false);

    //...
    return Ok(());
}

fn main()
{

}
