From 339c114cb0dc6221368cec12d58d152290d343f2 Mon Sep 17 00:00:00 2001 From: easong-openai Date: Wed, 13 Aug 2025 17:23:10 -0700 Subject: [PATCH] better? --- codex-rs/login/src/token_data.rs | 70 ++++++++++---------------------- 1 file changed, 22 insertions(+), 48 deletions(-) diff --git a/codex-rs/login/src/token_data.rs b/codex-rs/login/src/token_data.rs index 13a9eaea48..bda256b946 100644 --- a/codex-rs/login/src/token_data.rs +++ b/codex-rs/login/src/token_data.rs @@ -3,15 +3,19 @@ use serde::Deserialize; use serde::Serialize; use thiserror::Error; -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[serde(try_from = "TokenDataDe")] pub struct TokenData { /// Flat info parsed from the JWT in auth.json (not serialized). + #[serde(skip)] pub id_token: IdTokenInfo, /// Raw JWT string used for serialization as `tokens.id_token` on disk. + #[serde(rename = "id_token")] pub id_token_raw: String, /// This is a JWT. pub access_token: String, pub refresh_token: String, + #[serde(skip_serializing_if = "Option::is_none")] pub account_id: Option, } @@ -52,57 +56,27 @@ impl TokenData { } } -impl Serialize for TokenData { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - #[derive(Serialize)] - struct Ser<'a> { - #[serde(rename = "id_token")] - id_token_raw: &'a str, - access_token: &'a str, - refresh_token: &'a str, - #[serde(skip_serializing_if = "Option::is_none")] - account_id: &'a Option, - } - let helper = Ser { - id_token_raw: &self.id_token_raw, - access_token: &self.access_token, - refresh_token: &self.refresh_token, - account_id: &self.account_id, - }; - helper.serialize(serializer) - } +#[derive(Deserialize)] +struct TokenDataDe { + #[serde(rename = "id_token")] + id_token_raw: String, + access_token: String, + refresh_token: String, + #[serde(default)] + account_id: Option, } -impl<'de> Deserialize<'de> for TokenData { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - #[derive(Deserialize)] - struct De { - #[serde(rename = "id_token")] - id_token_raw: String, - access_token: String, - refresh_token: String, - #[serde(default)] - account_id: Option, - } - let De { - id_token_raw, - access_token, - refresh_token, - account_id, - } = De::deserialize(deserializer)?; - let id_token = parse_id_token(&id_token_raw).map_err(serde::de::Error::custom)?; +impl TryFrom for TokenData { + type Error = IdTokenInfoError; + + fn try_from(de: TokenDataDe) -> Result { + let id_token = parse_id_token(&de.id_token_raw)?; Ok(TokenData { id_token, - id_token_raw, - access_token, - refresh_token, - account_id, + id_token_raw: de.id_token_raw, + access_token: de.access_token, + refresh_token: de.refresh_token, + account_id: de.account_id, }) } }