Skip to content

Commit

Permalink
env var updates
Browse files Browse the repository at this point in the history
Signed-off-by: Jess Frazelle <github@jessfraz.com>
  • Loading branch information
jessfraz committed Oct 25, 2024
1 parent 84fe8b6 commit ffc4c96
Show file tree
Hide file tree
Showing 7 changed files with 223 additions and 29 deletions.
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ kittycad: target/debug/openapitor
-d "A fully generated & opinionated API client for the KittyCAD API." \
--spec-url "https://api.zoo.dev" \
--base-url "https://api.zoo.dev" \
--add-env-prefix "ZOO" \
--request-timeout-seconds 600 \
--clippy-fix \
--repo-name "KittyCAD/kittycad.rs" $(EXTRA_ARGS)
Expand Down
2 changes: 1 addition & 1 deletion VERSION.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.3.23
0.3.24
1 change: 1 addition & 0 deletions kittycad/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ Alternatively, the library can search for most of the variables required for
the client in the environment:

- `KITTYCAD_API_TOKEN`
- `ZOO_API_TOKEN`

And then you can create a client from the environment.

Expand Down
22 changes: 19 additions & 3 deletions kittycad/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
//! the client in the environment:
//!
//! - `KITTYCAD_API_TOKEN`
//! - `ZOO_API_TOKEN`
//!
//! And then you can create a client from the environment.
//!
Expand Down Expand Up @@ -335,12 +336,27 @@ impl Client {
self.base_url = base_url.to_string().trim_end_matches('/').to_string();
}

/// Create a new Client struct from the environment variable: `KITTYCAD_API_TOKEN`.
/// Create a new Client struct from the environment variable: `ENV_VARIABLE_PREFIX_API_TOKEN`.
#[tracing::instrument]
pub fn new_from_env() -> Self {
let token = env::var("KITTYCAD_API_TOKEN").expect("must set KITTYCAD_API_TOKEN");
let token = if let Ok(token) = env::var("KITTYCAD_API_TOKEN") {
token
} else if let Ok(token) = env::var("ZOO_API_TOKEN") {
token
} else {
panic!("must set KITTYCAD_API_TOKEN or ZOO_API_TOKEN");
};
let base_url = if let Ok(base_url) = env::var("KITTYCAD_HOST") {
base_url
} else if let Ok(base_url) = env::var("ZOO_HOST") {
base_url
} else {
"https://api.zoo.dev".to_string()
};

Client::new(token)
let mut c = Client::new(token);
c.set_base_url(base_url);
c
}

/// Create a raw request to our API.
Expand Down
187 changes: 162 additions & 25 deletions openapitor/src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ pub fn generate_client(opts: &crate::Opts) -> String {

return CLIENT_FUNCTIONS_OAUTH_TOKEN
.replace(
"ENV_VARIABLE_PREFIX",
&crate::template::get_env_variable_prefix(&opts.name),
"ENV_VARIABLE_CODE",
&get_env_variable_code_oauth_token(opts),
)
.replace("TOKEN_ENDPOINT", token_endpoint.as_ref())
.replace(
Expand All @@ -31,10 +31,7 @@ pub fn generate_client(opts: &crate::Opts) -> String {
"TIMEOUT_NUM_SECONDS",
&opts.request_timeout_seconds.to_string(),
)
.replace(
"ENV_VARIABLE_PREFIX",
&crate::template::get_env_variable_prefix(&opts.name),
)
.replace("ENV_VARIABLE_CODE", &get_env_variable_code_basic_auth(opts))
.replace("BASE_URL", opts.base_url.to_string().trim_end_matches('/'));
}

Expand All @@ -43,11 +40,60 @@ pub fn generate_client(opts: &crate::Opts) -> String {
"TIMEOUT_NUM_SECONDS",
&opts.request_timeout_seconds.to_string(),
)
.replace("ENV_VARIABLE_CODE", &get_env_variable_code_token(opts))
.replace("BASE_URL", opts.base_url.to_string().trim_end_matches('/'))
}

fn get_env_variable_code_basic_auth(opts: &crate::Opts) -> String {
let start = if let Some(add_env_prefix) = &opts.add_env_prefix {
r#"let username = if let Ok(username) = env::var("ENV_VARIABLE_PREFIX_USERNAME") {
username
} else if let Ok(username) = env::var("ADD_ENV_VARIABLE_PREFIX_USERNAME") {
username
} else {
panic!("must set ENV_VARIABLE_PREFIX_USERNAME or ADD_ENV_VARIABLE_PREFIX_USERNAME");
};
let password = if let Ok(password) = env::var("ENV_VARIABLE_PREFIX_PASSWORD") {
password
} else if let Ok(password) = env::var("ADD_ENV_VARIABLE_PREFIX_PASSWORD") {
password
} else {
panic!("must set ENV_VARIABLE_PREFIX_PASSWORD or ADD_ENV_VARIABLE_PREFIX_PASSWORD");
};
let base_url = if let Ok(base_url) = env::var("ENV_VARIABLE_PREFIX_HOST") {
base_url
} else if let Ok(base_url) = env::var("ADD_ENV_VARIABLE_PREFIX_HOST") {
base_url
} else {
"BASE_URL".to_string()
};"#
.replace(
"ADD_ENV_VARIABLE_PREFIX",
&crate::template::get_env_variable_prefix(add_env_prefix),
)
.replace(
"ENV_VARIABLE_PREFIX",
&crate::template::get_env_variable_prefix(&opts.name),
)
.replace("BASE_URL", opts.base_url.to_string().trim_end_matches('/'))
} else {
r#"let username = env::var("ENV_VARIABLE_PREFIX_USERNAME").expect("must set ENV_VARIABLE_PREFIX_USERNAME");
let password = env::var("ENV_VARIABLE_PREFIX_PASSWORD").expect("must set ENV_VARIABLE_PREFIX_PASSWORD");
let base_url = env::var("ENV_VARIABLE_PREFIX_HOST").unwrap_or("BASE_URL".to_string());"#.replace("ENV_VARIABLE_PREFIX", &crate::template::get_env_variable_prefix(&opts.name))
};

format!(
r#"{}
let mut c = Client::new(
username,
password,
);
c.set_base_url(base_url);
c
"#,
start
)
}

const CLIENT_FUNCTIONS_BASIC_AUTH: &str = r#"
Expand Down Expand Up @@ -143,17 +189,12 @@ impl Client {
self.base_url = base_url.to_string().trim_end_matches('/').to_string();
}
/// Create a new Client struct from the environment variable: `ENV_VARIABLE_PREFIX_API_TOKEN`.
/// Create a new Client struct from the environment variable: `ENV_VARIABLE_PREFIX_USERNAME`
/// and `ENV_VARIABLE_PREFIX_PASSWORD`.
#[tracing::instrument]
pub fn new_from_env() -> Self
{
let username = env::var("ENV_VARIABLE_PREFIX_USERNAME").expect("must set ENV_VARIABLE_PREFIX_USERNAME");
let password = env::var("ENV_VARIABLE_PREFIX_PASSWORD").expect("must set ENV_VARIABLE_PREFIX_PASSWORD");
Client::new(
username,
password,
)
ENV_VARIABLE_CODE
}
/// Create a raw request to our API.
Expand Down Expand Up @@ -197,6 +238,50 @@ impl Client {
}
"#;

fn get_env_variable_code_token(opts: &crate::Opts) -> String {
let start = if let Some(add_env_prefix) = &opts.add_env_prefix {
r#"let token = if let Ok(token) = env::var("ENV_VARIABLE_PREFIX_API_TOKEN") {
token
} else if let Ok(token) = env::var("ADD_ENV_VARIABLE_PREFIX_API_TOKEN") {
token
} else {
panic!("must set ENV_VARIABLE_PREFIX_API_TOKEN or ADD_ENV_VARIABLE_PREFIX_API_TOKEN");
};
let base_url = if let Ok(base_url) = env::var("ENV_VARIABLE_PREFIX_HOST") {
base_url
} else if let Ok(base_url) = env::var("ADD_ENV_VARIABLE_PREFIX_HOST") {
base_url
} else {
"BASE_URL".to_string()
};"#
.replace(
"ADD_ENV_VARIABLE_PREFIX",
&crate::template::get_env_variable_prefix(add_env_prefix),
)
.replace(
"ENV_VARIABLE_PREFIX",
&crate::template::get_env_variable_prefix(&opts.name),
)
} else {
r#"let token = env::var("ENV_VARIABLE_PREFIX_API_TOKEN").expect("must set ENV_VARIABLE_PREFIX_API_TOKEN");
let base_url = env::var("ENV_VARIABLE_PREFIX_HOST").unwrap_or("BASE_URL".to_string());
"#.replace("ENV_VARIABLE_PREFIX", &crate::template::get_env_variable_prefix(&opts.name))
};

format!(
r#"{}
let mut c = Client::new(
token,
);
c.set_base_url(base_url);
c
"#,
start
)
}

const CLIENT_FUNCTIONS_TOKEN: &str = r#"
#[cfg(feature = "requests")]
use std::env;
Expand Down Expand Up @@ -399,11 +484,7 @@ impl Client {
#[tracing::instrument]
pub fn new_from_env() -> Self
{
let token = env::var("ENV_VARIABLE_PREFIX_API_TOKEN").expect("must set ENV_VARIABLE_PREFIX_API_TOKEN");
Client::new(
token,
)
ENV_VARIABLE_CODE
}
/// Create a raw request to our API.
Expand Down Expand Up @@ -447,6 +528,66 @@ impl Client {
}
"#;

fn get_env_variable_code_oauth_token(opts: &crate::Opts) -> String {
let start = if let Some(add_env_prefix) = &opts.add_env_prefix {
r#"let client_id = if let Ok(client_id) = env::var("ENV_VARIABLE_PREFIX_CLIENT_ID") {
client_id
} else {
if let Ok(client_id) = env::var("ADD_ENV_VARIABLE_PREFIX_CLIENT_ID") {
client_id
} else {
panic!("must set ENV_VARIABLE_PREFIX_CLIENT_ID or ADD_ENV_VARIABLE_PREFIX_CLIENT_ID");
}
};
};
let client_secret = if let Ok(client_secret) = env::var("ENV_VARIABLE_PREFIX_CLIENT_SECRET") {
client_secret
} else if let Ok(client_secret) = env::var("ADD_ENV_VARIABLE_PREFIX_CLIENT_SECRET") {
client_secret
} else {
panic!("must set ENV_VARIABLE_PREFIX_CLIENT_SECRET or ADD_ENV_VARIABLE_PREFIX_CLIENT_SECRET");
};
let redirect_uri = if let Ok(redirect_uri) = env::var("ENV_VARIABLE_PREFIX_REDIRECT_URI") {
redirect_uri
} else if let Ok(redirect_uri) = env::var("ADD_ENV_VARIABLE_PREFIX_REDIRECT_URI") {
redirect_uri
} else {
panic!("must set ENV_VARIABLE_PREFIX_REDIRECT_URI or ADD_ENV_VARIABLE_PREFIX_REDIRECT_URI");
};
let base_url = if let Ok(base_url) = env::var("ENV_VARIABLE_PREFIX_HOST"){
base_url
} else if let Ok(base_url) = env::var("ADD_ENV_VARIABLE_PREFIX_HOST") {
base_url
} else {
"BASE_URL".to_string()
};"#
.replace(
"ADD_ENV_VARIABLE_PREFIX",
&crate::template::get_env_variable_prefix(add_env_prefix),
)
.replace(
"ENV_VARIABLE_PREFIX",
&crate::template::get_env_variable_prefix(&opts.name),
)
} else {
r#"let client_id = env::var("ENV_VARIABLE_PREFIX_CLIENT_ID").expect("must set ENV_VARIABLE_PREFIX_CLIENT_ID");
let client_secret = env::var("ENV_VARIABLE_PREFIX_CLIENT_SECRET").expect("must set ENV_VARIABLE_PREFIX_CLIENT_SECRET");
let redirect_uri = env::var("ENV_VARIABLE_PREFIX_REDIRECT_URI").expect("must set ENV_VARIABLE_PREFIX_REDIRECT_URI");
let base_url = env::var("ENV_VARIABLE_PREFIX_HOST").unwrap_or("BASE_URL".to_string());"#.replace("ENV_VARIABLE_PREFIX", &crate::template::get_env_variable_prefix(&opts.name))
};

format!(
r#"{}
let mut c = Client::new(client_id, client_secret, redirect_uri, token, refresh_token);
c.set_base_url(base_url);
c
"#,
start
)
}

const CLIENT_FUNCTIONS_OAUTH_TOKEN: &str = r#"
use std::{env, sync::Arc, convert::TryInto, ops::Add, time::{Duration, Instant}};
Expand Down Expand Up @@ -690,11 +831,7 @@ impl Client {
T: ToString + std::fmt::Debug,
R: ToString + std::fmt::Debug,
{
let client_id = env::var("ENV_VARIABLE_PREFIX_CLIENT_ID").expect("must set ENV_VARIABLE_PREFIX_CLIENT_ID");
let client_secret = env::var("ENV_VARIABLE_PREFIX_CLIENT_SECRET").expect("must set ENV_VARIABLE_PREFIX_CLIENT_SECRET");
let redirect_uri = env::var("ENV_VARIABLE_PREFIX_REDIRECT_URI").expect("must set ENV_VARIABLE_PREFIX_REDIRECT_URI");
Client::new(client_id, client_secret, redirect_uri, token, refresh_token)
ENV_VARIABLE_CODE
}
/// Return a user consent url with an optional set of scopes.
Expand Down
6 changes: 6 additions & 0 deletions openapitor/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,11 @@ pub struct Opts {
#[arg(long)]
pub request_timeout_seconds: u64,

/// An additional env variable prefix (the default is the name of the package).
/// If given, both the package name and this prefix will be used.
#[arg(long)]
pub add_env_prefix: Option<String>,

/// Run clippy --fix on the output code
#[arg(long, default_value = "false")]
pub clippy_fix: bool,
Expand Down Expand Up @@ -540,6 +545,7 @@ impl Default for Opts {
date_time_format: Default::default(),
basic_auth: Default::default(),
clippy_fix: false,
add_env_prefix: Default::default(),
request_timeout_seconds: 60,
}
}
Expand Down
Loading

0 comments on commit ffc4c96

Please sign in to comment.