id ?? '') < 1 || strlen($data->nonce ?? '') < 1 || /* if missing both token and password (we require one of them) */ (strlen($data->token ?? '') < 1 && strlen($data->password ?? '') < 1) ) { /* returns null as the input is invalid */ return null; } $payload = new Payload(); $payload->id = $data->id; $payload->nonce = $data->nonce; $payload->json = ($data->json ?? true); $payload->scope = Scope::tryFrom($data->scope ?? '') ?? Scope::Cookie; /* we accept either a token or a password, not both */ if (strlen($data->token ?? '') > 0) { $payload->token = $data->token; $payload->password = null; } else { $payload->token = null; $payload->password = $data->password; } return Payload::constrict($payload); } public static function constrict(Payload $payload): Payload { /* When using password, scope will be considered None. */ if ($payload->password) { $payload->scope = Scope::None; } /* When scope is None, json will be considered false. */ if ($payload->scope === Scope::None) { $payload->json = false; } return $payload; } public function toString(): string { return json_encode($this); } }