#![allow(
missing_docs,
reason = "fields mirror pi's TypeScript types; contracts are noted where they differ from the name"
)]
use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
pub type AuthFile = IndexMap<String, Credential>;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum Credential {
#[serde(rename = "api_key")]
ApiKey(ApiKeyCredential),
#[serde(rename = "oauth")]
OAuth(OAuthCredential),
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct ApiKeyCredential {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub key: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub env: Option<IndexMap<String, String>>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct OAuthCredential {
pub access: String,
pub refresh: String,
#[serde(serialize_with = "js_number")]
pub expires: f64,
#[serde(flatten)]
pub extra: Map<String, Value>,
}
fn js_number<S: serde::Serializer>(value: &f64, serializer: S) -> Result<S::Ok, S::Error> {
crate::json::number(*value).serialize(serializer)
}
#[derive(Clone, Debug, Default, PartialEq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ModelAuth {
#[serde(default)]
pub api_key: Option<String>,
#[serde(default)]
pub headers: IndexMap<String, Option<String>>,
#[serde(default)]
pub base_url: Option<String>,
}
#[derive(Clone, Debug, Default, PartialEq, Deserialize)]
pub struct AuthResult {
pub auth: ModelAuth,
#[serde(default)]
pub env: Option<IndexMap<String, String>>,
#[serde(default)]
pub source: Option<String>,
}