(ctx: Context, claims: Claims)
| 112 | } |
| 113 | |
| 114 | fn claims_to_object(ctx: Context, claims: Claims) -> Value { |
| 115 | let mut obj = Object::default(); |
| 116 | |
| 117 | // Add standard claims |
| 118 | if let Some(iss) = claims.iss { |
| 119 | obj.fields.insert( |
| 120 | ctx.intern(b"iss"), |
| 121 | Value::String(ctx.intern(iss.as_bytes())), |
| 122 | ); |
| 123 | } |
| 124 | if let Some(sub) = claims.sub { |
| 125 | obj.fields.insert( |
| 126 | ctx.intern(b"sub"), |
| 127 | Value::String(ctx.intern(sub.as_bytes())), |
| 128 | ); |
| 129 | } |
| 130 | if let Some(aud) = claims.aud { |
| 131 | obj.fields.insert( |
| 132 | ctx.intern(b"aud"), |
| 133 | Value::String(ctx.intern(aud.as_bytes())), |
| 134 | ); |
| 135 | } |
| 136 | if let Some(exp) = claims.exp { |
| 137 | obj.fields |
| 138 | .insert(ctx.intern(b"exp"), Value::Number(exp as f64)); |
| 139 | } |
| 140 | if let Some(nbf) = claims.nbf { |
| 141 | obj.fields |
| 142 | .insert(ctx.intern(b"nbf"), Value::Number(nbf as f64)); |
| 143 | } |
| 144 | if let Some(iat) = claims.iat { |
| 145 | obj.fields |
| 146 | .insert(ctx.intern(b"iat"), Value::Number(iat as f64)); |
| 147 | } |
| 148 | if let Some(jti) = claims.jti { |
| 149 | obj.fields.insert( |
| 150 | ctx.intern(b"jti"), |
| 151 | Value::String(ctx.intern(jti.as_bytes())), |
| 152 | ); |
| 153 | } |
| 154 | |
| 155 | // Add custom claims |
| 156 | for (key, value) in claims.extra { |
| 157 | let value = match value { |
| 158 | serde_json::Value::String(s) => Value::String(ctx.intern(s.as_bytes())), |
| 159 | serde_json::Value::Number(n) => Value::Number(n.as_f64().unwrap_or(0.0)), |
| 160 | serde_json::Value::Bool(b) => Value::Boolean(b), |
| 161 | serde_json::Value::Null => Value::Nil, |
| 162 | _ => continue, // Skip unsupported types |
| 163 | }; |
| 164 | obj.fields.insert(ctx.intern(key.as_bytes()), value); |
| 165 | } |
| 166 | |
| 167 | Value::Object(Gc::new(&ctx, RefLock::new(obj))) |
| 168 | } |
| 169 | |
| 170 | fn jwt_encode<'gc>(state: &mut State<'gc>, args: Vec<Value<'gc>>) -> Result<Value<'gc>, VmError> { |
| 171 | if args.len() != 3 { |
no test coverage detected