feat(secret): added get_or_prompt functionality and debuggable ipxe chainloading boot file and some misc stuff
Some checks failed
Run Check Script / check (pull_request) Failing after 29s
Some checks failed
Run Check Script / check (pull_request) Failing after 29s
This commit is contained in:
@@ -18,6 +18,7 @@ infisical = { git = "https://github.com/jggc/rust-sdk.git", branch = "patch-1" }
|
||||
tokio.workspace = true
|
||||
async-trait.workspace = true
|
||||
http.workspace = true
|
||||
inquire.workspace = true
|
||||
|
||||
[dev-dependencies]
|
||||
pretty_assertions.workspace = true
|
||||
|
||||
@@ -110,6 +110,42 @@ impl SecretManager {
|
||||
})
|
||||
}
|
||||
|
||||
pub async fn get_or_prompt<T: Secret>() -> Result<T, SecretStoreError> {
|
||||
let secret = Self::get::<T>().await;
|
||||
let manager = get_secret_manager().await;
|
||||
let prompted = secret.is_err();
|
||||
|
||||
let secret = secret.or_else(|e| -> Result<T, SecretStoreError> {
|
||||
debug!("Could not get secret : {e}");
|
||||
|
||||
let ns = &manager.namespace;
|
||||
let key = T::KEY;
|
||||
let secret_json = inquire::Text::new(&format!(
|
||||
"Secret not found for {} {}, paste the JSON here :",
|
||||
ns, key
|
||||
))
|
||||
.prompt()
|
||||
.map_err(|e| {
|
||||
SecretStoreError::Store(format!("Failed to prompt secret {ns} {key} : {e}").into())
|
||||
})?;
|
||||
|
||||
let secret: T = serde_json::from_str(&secret_json).map_err(|e| {
|
||||
SecretStoreError::Deserialization {
|
||||
key: T::KEY.to_string(),
|
||||
source: e,
|
||||
}
|
||||
})?;
|
||||
|
||||
Ok(secret)
|
||||
})?;
|
||||
|
||||
if prompted {
|
||||
Self::set(&secret).await?;
|
||||
}
|
||||
|
||||
Ok(secret)
|
||||
}
|
||||
|
||||
/// Serializes and stores a secret.
|
||||
pub async fn set<T: Secret>(secret: &T) -> Result<(), SecretStoreError> {
|
||||
let manager = get_secret_manager().await;
|
||||
|
||||
Reference in New Issue
Block a user