use std::error::Error; use anyhow::Context; use config::Config; use deez::auth::AuthPromptHandler; use deez::client::DeezerClient; 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/playlists/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 client = DeezerClient::new(); let access_token = client .get_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() ); let me = client.get_me(access_token.clone()).await?; println!("{:#?}", me); let playlists = client.get_user_playlists(me.id, access_token).await?; println!("Playlists: {:#?}", playlists); Ok(()) }