This commit is contained in:
Christien Rioux 2023-07-05 17:48:06 -05:00
parent e3d66b60e4
commit d6999c36a9
22 changed files with 9697 additions and 1183 deletions

View file

@ -1,6 +1,9 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:equatable/equatable.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
String base64UrlNoPadEncode(List<int> bytes) {
var x = base64Url.encode(bytes);
while (x.endsWith('=')) {
@ -20,97 +23,91 @@ Uint8List base64UrlNoPadDecodeDynamic(dynamic source) {
return base64.decode(source);
}
abstract class EncodedString {
late String contents;
EncodedString(String s) {
validate(s);
contents = s;
}
EncodedString.encode(List<int> b) {
var s = base64UrlNoPadEncode(b);
validate(s);
contents = s;
}
@immutable
abstract class EncodedString extends Equatable {
final String contents;
@override
List<Object> get props => [contents];
int encodedLength();
int decodedLength();
void validate(String s) {
var d = base64UrlNoPadDecode(s);
if (d.length != decodedLength()) {
throw Exception("length ${s.length} should be ${encodedLength()}");
}
}
const EncodedString(String s) : contents = s;
Uint8List decode() {
return base64UrlNoPadDecode(contents);
}
@override
String toString() {
return contents;
}
String toString() => contents;
static T fromString<T extends EncodedString>(String s) {
switch (T) {
case FixedEncodedString32:
return FixedEncodedString32(s) as T;
return FixedEncodedString32.fromString(s) as T;
case FixedEncodedString43:
return FixedEncodedString43(s) as T;
return FixedEncodedString43.fromString(s) as T;
case FixedEncodedString86:
return FixedEncodedString86(s) as T;
return FixedEncodedString86.fromString(s) as T;
default:
throw UnimplementedError();
}
}
}
@immutable
class FixedEncodedString32 extends EncodedString {
FixedEncodedString32(String s) : super(s);
@override
int encodedLength() {
const FixedEncodedString32._(String s) : super(s);
static int encodedLength() {
return 32;
}
@override
int decodedLength() {
static int decodedLength() {
return 24;
}
String toJson() {
return toString();
factory FixedEncodedString32.fromString(String s) {
var d = base64UrlNoPadDecode(s);
if (d.length != decodedLength()) {
throw Exception("length ${s.length} should be ${encodedLength()}");
}
return FixedEncodedString32._(s);
}
FixedEncodedString32.fromJson(dynamic json) : this(json as String);
String toJson() => toString();
factory FixedEncodedString32.fromJson(dynamic json) =>
FixedEncodedString32.fromString(json as String);
}
@immutable
class FixedEncodedString43 extends EncodedString {
FixedEncodedString43(String s) : super(s);
@override
int encodedLength() {
const FixedEncodedString43._(String s) : super(s);
static int encodedLength() {
return 43;
}
@override
int decodedLength() {
static int decodedLength() {
return 32;
}
String toJson() {
return toString();
factory FixedEncodedString43.fromString(String s) {
var d = base64UrlNoPadDecode(s);
if (d.length != decodedLength()) {
throw Exception("length ${s.length} should be ${encodedLength()}");
}
return FixedEncodedString43._(s);
}
FixedEncodedString43.fromJson(dynamic json) : this(json as String);
String toJson() => toString();
factory FixedEncodedString43.fromJson(dynamic json) =>
FixedEncodedString43.fromString(json as String);
}
@immutable
class FixedEncodedString86 extends EncodedString {
FixedEncodedString86(String s) : super(s);
@override
int encodedLength() {
const FixedEncodedString86._(String s) : super(s);
static int encodedLength() {
return 86;
}
@override
int decodedLength() {
static int decodedLength() {
return 64;
}
@ -118,5 +115,14 @@ class FixedEncodedString86 extends EncodedString {
return toString();
}
FixedEncodedString86.fromJson(dynamic json) : this(json as String);
factory FixedEncodedString86.fromString(String s) {
var d = base64UrlNoPadDecode(s);
if (d.length != decodedLength()) {
throw Exception("length ${s.length} should be ${encodedLength()}");
}
return FixedEncodedString86._(s);
}
factory FixedEncodedString86.fromJson(dynamic json) =>
FixedEncodedString86.fromString(json as String);
}