use std::error::Error; use anyhow::Context; use config::Config; use deez::auth::{request_access_token, AuthPromptHandler}; use serde::Deserialize; #[derive(Deserialize)] struct Settings { app_id: u32, secret_key: String, address: String, port: u16, uri_scheme: String, } #[tokio::main] async fn main() -> Result<(), Box> { let settings = Config::builder() .add_source(config::File::with_name("examples/access_token/Settings")) .build() .with_context(|| "Failed to read settings")? .try_deserialize::() .with_context(|| "Invalid settings")?; let auth_code_prompt_info = AuthPromptHandler::run( settings.app_id, settings.address, settings.port, settings.uri_scheme, ) .await?; println!("{}", auth_code_prompt_info.auth_prompt_url); let auth_code = auth_code_prompt_info.handler.await??; println!("Retrieved authentication code '{}'", auth_code); let access_token = request_access_token(settings.app_id, settings.secret_key, auth_code).await?; println!( "Retrieved access token '{}' which expires in {} seconds", access_token.access_token, access_token.expires.as_secs() ); Ok(()) }