about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVika <vika@fireburn.ru>2022-07-14 17:51:49 +0300
committerVika <vika@fireburn.ru>2022-07-15 00:31:27 +0300
commit0b47da2af8c02da35e310981919ad097e6897d16 (patch)
tree77c3be3457942ee763d5be623349ad0f8a54b8a5
parent2c509e85429c70b528a73d7a57a3c080fb8b06bf (diff)
kittybox-indieauth: add From impls for TokenIntrospectionResponse
This makes converting Option<TokenData> into a response and vice versa
a breeze, and hide the complexity of TokenIntrospectionResponse forced
upon this library by the IndieAuth standard.

Really, this type should've been represented as Option<TokenData>, I
just don't know how to add the "active" field to it properly.
-rw-r--r--kittybox-rs/indieauth/src/lib.rs16
1 files changed, 16 insertions, 0 deletions
diff --git a/kittybox-rs/indieauth/src/lib.rs b/kittybox-rs/indieauth/src/lib.rs
index 242317d..3575132 100644
--- a/kittybox-rs/indieauth/src/lib.rs
+++ b/kittybox-rs/indieauth/src/lib.rs
@@ -197,6 +197,10 @@ impl TokenData {
     }
 }
 
+// I don't like this type, because it could've been represented
+// internally by Option<TokenData>. But the IndieAuth standard
+// requires the "active" field to be present. I can't do anything
+// about it.
 #[derive(Debug, Serialize, Deserialize)]
 pub struct TokenIntrospectionResponse {
     active: bool,
@@ -204,6 +208,8 @@ pub struct TokenIntrospectionResponse {
     #[serde(skip_serializing_if = "Option::is_none")]
     data: Option<TokenData>
 }
+// These wrappers and impls should take care of making use of this
+// type as painless as possible.
 impl TokenIntrospectionResponse {
     pub fn inactive() -> Self {
         Self { active: false, data: None }
@@ -228,6 +234,16 @@ impl Default for TokenIntrospectionResponse {
         Self::inactive()
     }
 }
+impl From<Option<TokenData>> for TokenIntrospectionResponse {
+    fn from(data: Option<TokenData>) -> Self {
+        Self { active: data.is_some(), data }
+    }
+}
+impl From<TokenIntrospectionResponse> for Option<TokenData> {
+    fn from(response: TokenIntrospectionResponse) -> Option<TokenData> {
+        response.data
+    }
+}
 
 #[derive(Debug, Serialize, Deserialize)]
 pub struct TokenRevocationRequest {