@@ -2,6 +2,8 @@ import gleam/dict.{type Dict}
22import gleam/dynamic . { type Dynamic }
33import gleam/dynamic/decode
44import gleam/int
5+ import gleam/json
6+ import gleam/list
57import gleam/option . { Some }
68import gleam/result
79import gleam/string
@@ -80,7 +82,11 @@ fn claims_section(claims: Dict(String, Dynamic)) -> Node {
8082 } ) ,
8183 Column ( "Value" , fn ( record : # ( String , Dynamic ) ) {
8284 let # ( _key , value ) = record
83- html . Text ( string . inspect ( value ) )
85+
86+ html . pre_text (
87+ [ class ( "whitespace-pre-wrap break-all font-mono text-xs" ) ] ,
88+ claim_value_json ( value ) ,
89+ )
8490 } ) ,
8591 ] ,
8692 dict . to_list ( claims ) ,
@@ -89,6 +95,64 @@ fn claims_section(claims: Dict(String, Dynamic)) -> Node {
8995 ] )
9096}
9197
98+ fn claim_value_json ( value : Dynamic ) -> String {
99+ value
100+ |> dynamic_to_json ( )
101+ |> json . to_string ( )
102+ }
103+
104+ fn dynamic_to_json ( value : Dynamic ) -> json . Json {
105+ case decode . run ( value , decode . string ) {
106+ Ok ( v ) -> json . string ( v )
107+ Error ( _ ) ->
108+ case decode . run ( value , decode . bool ) {
109+ Ok ( v ) -> json . bool ( v )
110+ Error ( _ ) ->
111+ case decode . run ( value , decode . int ) {
112+ Ok ( v ) -> json . int ( v )
113+ Error ( _ ) ->
114+ case decode . run ( value , decode . float ) {
115+ Ok ( v ) -> json . float ( v )
116+ Error ( _ ) ->
117+ case decode . run ( value , decode . list ( decode . dynamic ) ) {
118+ Ok ( values ) -> json . array ( values , dynamic_to_json )
119+ Error ( _ ) ->
120+ case
121+ decode . run (
122+ value ,
123+ decode . dict ( decode . dynamic , decode . dynamic ) ,
124+ )
125+ {
126+ Ok ( values ) ->
127+ json . object (
128+ list . map ( dict . to_list ( values ) , fn ( entry ) {
129+ let # ( k , v ) = entry
130+ # ( dynamic_key_to_string ( k ) , dynamic_to_json ( v ) )
131+ } ) ,
132+ )
133+ Error ( _ ) ->
134+ case
135+ decode . run ( value , decode . optional ( decode . dynamic ) )
136+ {
137+ Ok ( Some ( v ) ) -> dynamic_to_json ( v )
138+ Ok ( _ ) -> json . null ( )
139+ Error ( _ ) -> json . string ( string . inspect ( value ) )
140+ }
141+ }
142+ }
143+ }
144+ }
145+ }
146+ }
147+ }
148+
149+ fn dynamic_key_to_string ( key : Dynamic ) -> String {
150+ case decode . run ( key , decode . string ) {
151+ Ok ( value ) -> value
152+ Error ( _ ) -> string . inspect ( key )
153+ }
154+ }
155+
92156fn decode_string ( d : Dynamic ) -> Result ( String , String ) {
93157 decode . run ( d , decode . string )
94158 |> result . replace_error ( "Invalid string: " <> string . inspect ( d ) )
0 commit comments