Skip to main content

yapi_types/
auth.rs

1//! `auth.json`: stored credentials keyed by provider id.
2//!
3//! Mirrors `packages/ai/src/auth/types.ts` in pi `v1.0.0`.
4#![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
13/// The whole file: provider id to credential.
14pub type AuthFile = IndexMap<String, Credential>;
15
16/// A stored credential, tagged by `type`.
17#[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/// Values may be literals, `$VAR` templates or `!command`s; see pi's
27/// `resolve-config-value.ts`.
28#[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    /// Extra environment for the provider, such as a region.
33    #[serde(default, skip_serializing_if = "Option::is_none")]
34    pub env: Option<IndexMap<String, String>>,
35}
36
37/// OAuth tokens. Providers store additional fields, such as `accountId` or
38/// `enterpriseUrl`, which are kept in `extra`.
39#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
40pub struct OAuthCredential {
41    pub access: String,
42    pub refresh: String,
43    /// Expiry as Unix time in milliseconds.
44    pub expires: u64,
45    #[serde(flatten)]
46    pub extra: Map<String, Value>,
47}