1#![allow(
5 missing_docs,
6 reason = "fields mirror pi's TypeScript types; contracts are noted where they differ from the name"
7)]
8
9use indexmap::IndexMap;
10use serde::{Deserialize, Serialize};
11use serde_json::{Map, Value};
12
13pub type AuthFile = IndexMap<String, Credential>;
15
16#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
18#[serde(tag = "type")]
19pub enum Credential {
20 #[serde(rename = "api_key")]
21 ApiKey(ApiKeyCredential),
22 #[serde(rename = "oauth")]
23 OAuth(OAuthCredential),
24}
25
26#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
29pub struct ApiKeyCredential {
30 #[serde(default, skip_serializing_if = "Option::is_none")]
31 pub key: Option<String>,
32 #[serde(default, skip_serializing_if = "Option::is_none")]
34 pub env: Option<IndexMap<String, String>>,
35}
36
37#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
40pub struct OAuthCredential {
41 pub access: String,
42 pub refresh: String,
43 #[serde(serialize_with = "js_number")]
45 pub expires: f64,
46 #[serde(flatten)]
47 pub extra: Map<String, Value>,
48}
49
50fn js_number<S: serde::Serializer>(value: &f64, serializer: S) -> Result<S::Ok, S::Error> {
53 crate::json::number(*value).serialize(serializer)
54}
55
56#[derive(Clone, Debug, Default, PartialEq, Deserialize)]
59#[serde(rename_all = "camelCase")]
60pub struct ModelAuth {
61 #[serde(default)]
62 pub api_key: Option<String>,
63 #[serde(default)]
65 pub headers: IndexMap<String, Option<String>>,
66 #[serde(default)]
67 pub base_url: Option<String>,
68}
69
70#[derive(Clone, Debug, Default, PartialEq, Deserialize)]
73pub struct AuthResult {
74 pub auth: ModelAuth,
75 #[serde(default)]
76 pub env: Option<IndexMap<String, String>>,
77 #[serde(default)]
78 pub source: Option<String>,
79}