chore: cleanups. nicer interactive message.
This commit is contained in:
parent
e4191c75f3
commit
9d020efa8c
22
src/auth.rs
22
src/auth.rs
|
@ -32,9 +32,17 @@ impl Api {
|
||||||
/// Currently the only way to "authenticate" to an access token for this library.
|
/// Currently the only way to "authenticate" to an access token for this library.
|
||||||
pub async fn from_interactive_url() -> Result<Api, TeslatteError> {
|
pub async fn from_interactive_url() -> Result<Api, TeslatteError> {
|
||||||
let login_form = Self::get_login_url_for_user().await;
|
let login_form = Self::get_login_url_for_user().await;
|
||||||
dbg!(&login_form);
|
println!("{}", "-".repeat(80));
|
||||||
let callback_url =
|
println!("{}", login_form.url);
|
||||||
ask_input("Enter the URL of the 404 error page after you've logged in: ");
|
println!("{}", "-".repeat(80));
|
||||||
|
println!(
|
||||||
|
r#"Visit the URL above, and log in to your Tesla account if not already logged in.
|
||||||
|
After you log in (or already logged in), it will redirect you to a 404 error
|
||||||
|
page, where the URL will start with https://auth.tesla.com/void/callback?code=...
|
||||||
|
"#
|
||||||
|
);
|
||||||
|
let callback_url = ask_input("Enter the whole URL of the 404 page: ");
|
||||||
|
println!(); // Newline to make the next output more separated and clear.
|
||||||
|
|
||||||
let callback = Self::extract_callback_from_url(&callback_url)?;
|
let callback = Self::extract_callback_from_url(&callback_url)?;
|
||||||
if callback.state != login_form.state {
|
if callback.state != login_form.state {
|
||||||
|
@ -224,9 +232,17 @@ struct BearerTokenRequest {
|
||||||
struct BearerTokenResponse {
|
struct BearerTokenResponse {
|
||||||
access_token: String,
|
access_token: String,
|
||||||
refresh_token: String,
|
refresh_token: String,
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
expires_in: u32,
|
expires_in: u32,
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
state: String,
|
state: String,
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
token_type: String,
|
token_type: String,
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
id_token: String,
|
id_token: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,9 +29,9 @@ pub struct GatewayId(String);
|
||||||
#[derive(Debug, Clone, Deserialize)]
|
#[derive(Debug, Clone, Deserialize)]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
pub enum EnergySite {
|
pub enum EnergySite {
|
||||||
Vehicle(VehicleData),
|
Vehicle(Box<VehicleData>),
|
||||||
Solar(SolarData),
|
Solar(Box<SolarData>),
|
||||||
Powerwall(PowerwallData),
|
Powerwall(Box<PowerwallData>),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This is assumed from https://tesla-api.timdorr.com/api-basics/products
|
/// This is assumed from https://tesla-api.timdorr.com/api-basics/products
|
||||||
|
|
|
@ -37,6 +37,7 @@ pub struct ExternalVehicleId(u64);
|
||||||
|
|
||||||
pub struct Api {
|
pub struct Api {
|
||||||
pub access_token: AccessToken,
|
pub access_token: AccessToken,
|
||||||
|
// TODO: Why is this an Option?
|
||||||
pub refresh_token: Option<RefreshToken>,
|
pub refresh_token: Option<RefreshToken>,
|
||||||
client: Client,
|
client: Client,
|
||||||
}
|
}
|
||||||
|
|
13
src/main.rs
13
src/main.rs
|
@ -76,7 +76,7 @@ async fn main() -> miette::Result<()> {
|
||||||
match args.command {
|
match args.command {
|
||||||
Command::Auth { save } => {
|
Command::Auth { save } => {
|
||||||
let api = Api::from_interactive_url().await?;
|
let api = Api::from_interactive_url().await?;
|
||||||
updated_tokens(save, &api);
|
print_or_save_tokens(save, &api);
|
||||||
}
|
}
|
||||||
Command::Refresh { refresh_token } => {
|
Command::Refresh { refresh_token } => {
|
||||||
let (save, refresh_token) = match refresh_token {
|
let (save, refresh_token) = match refresh_token {
|
||||||
|
@ -88,7 +88,7 @@ async fn main() -> miette::Result<()> {
|
||||||
};
|
};
|
||||||
|
|
||||||
let api = Api::from_refresh_token(&refresh_token).await?;
|
let api = Api::from_refresh_token(&refresh_token).await?;
|
||||||
updated_tokens(save, &api);
|
print_or_save_tokens(save, &api);
|
||||||
}
|
}
|
||||||
Command::Api(api_args) => {
|
Command::Api(api_args) => {
|
||||||
let (access_token, refresh_token) = match &api_args.access_token {
|
let (access_token, refresh_token) = match &api_args.access_token {
|
||||||
|
@ -125,17 +125,20 @@ async fn main() -> miette::Result<()> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn updated_tokens(save: bool, api: &Api) {
|
fn print_or_save_tokens(save: bool, api: &Api) {
|
||||||
let access_token = api.access_token.clone();
|
let access_token = api.access_token.clone();
|
||||||
let refresh_token = api.refresh_token.clone().unwrap();
|
let refresh_token = api.refresh_token.clone().unwrap();
|
||||||
println!("Access token: {}", access_token);
|
|
||||||
println!("Refresh token: {}", refresh_token);
|
|
||||||
if save {
|
if save {
|
||||||
Config {
|
Config {
|
||||||
access_token,
|
access_token,
|
||||||
refresh_token,
|
refresh_token,
|
||||||
}
|
}
|
||||||
.save();
|
.save();
|
||||||
|
println!("Saved tokens to cli.json");
|
||||||
|
} else {
|
||||||
|
println!("Access token: {}", access_token);
|
||||||
|
println!("Refresh token: {}", refresh_token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue