Skip to content

Commit 4b81d68

Browse files
committed
Amended examples, doc, and tests.
1 parent 8ba4799 commit 4b81d68

File tree

7 files changed

+100
-224
lines changed

7 files changed

+100
-224
lines changed

example/README.md

Lines changed: 39 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ class Player {
2323
final columnName = 'Player';
2424
2525
/// Column storing player id.
26-
final id = const Column<Integer>(defaultValue: Integer(1), name: 'id');
26+
final id = const Column<int>(defaultValue: 1, name: 'id');
2727
2828
/// Column storing first name of player.
29-
final firstName = const Column<Text>(
30-
defaultValue: Text('Thomas'),
29+
final firstName = const Column<String>(
30+
defaultValue: 'Thomas',
3131
name: 'FirstName',
3232
);
3333
@@ -55,6 +55,12 @@ class Player {
5555
'two': 2.0,
5656
'enum': Greek.alpha
5757
};
58+
59+
/// Test list
60+
final list = const <List<int>>[
61+
[0, 1],
62+
[10, 11]
63+
];
5864
}
5965
6066
```
@@ -89,12 +95,12 @@ import 'package:test_types/test_types.dart';
8995
/// represented by a [ConstantReader].
9096
Future<void> main() async {
9197
/// Reading libraries.
92-
print('Reading player.dart');
98+
print('Reading player.dart ...');
9399
final playerLib = await initializeLibraryReaderForDirectory(
94100
'example/src',
95101
'player.dart',
96102
);
97-
print('Done');
103+
print('Done reading player.dart');
98104
99105
// ConstantReader representing field 'columnName'.
100106
final columnNameCR =
@@ -119,65 +125,33 @@ Future<void> main() async {
119125
final mapWithEnumEntryCR =
120126
ConstantReader(playerLib.classes.first.fields[8].computeConstantValue());
121127
122-
// // Get singleton instance of the reader.
123-
// final reader = GenericReader();
124-
125-
Integer integerDecoder(ConstantReader cr) {
126-
return Integer(cr.peek('value')?.intValue ?? double.nan.toInt());
127-
}
128-
129-
Real realDecoder(ConstantReader cr) {
130-
return Real(cr.peek('value')?.doubleValue ?? double.nan);
131-
}
132-
133-
Boolean booleanDecoder(ConstantReader cr) {
134-
return Boolean(cr.read('value').boolValue);
135-
}
136-
137-
Text textDecoder(ConstantReader cr) {
138-
return Text(cr.read('value').stringValue);
139-
}
140-
141-
SqliteType sqliteTypeDecoder(ConstantReader cr) {
142-
if (cr.holdsA<Integer>()) return cr.get<Integer>();
143-
if (cr.holdsA<Text>()) return cr.get<Text>();
144-
if (cr.holdsA<Real>()) return cr.get<Real>();
145-
if (cr.holdsA<Boolean>()) return cr.get<Boolean>();
146-
throw ErrorOf<Decoder<SqliteType>>(
147-
message: 'Could not reader const value of type `SqliteType`',
148-
invalidState: 'ConstantReader holds a const value of type '
149-
'`${cr.objectValue.type}`.');
150-
}
151-
152-
// Registering decoders.
153-
GenericReader.addDecoder<Integer>(integerDecoder);
154-
GenericReader.addDecoder<Boolean>(booleanDecoder);
155-
GenericReader.addDecoder<Text>(textDecoder);
156-
GenericReader.addDecoder<Real>(realDecoder);
157-
GenericReader.addDecoder<SqliteType>(sqliteTypeDecoder);
128+
final listCR =
129+
ConstantReader(playerLib.classes.first.fields[9].computeConstantValue());
158130
159131
// Adding a decoder for constants of type [Column].
160132
GenericReader.addDecoder<Column>((cr) {
161-
final defaultValue = cr.read('defaultValue').get<SqliteType>();
162133
final name = cr.read('name').get<String>();
163134
164-
Column<T> columnFactory<T extends SqliteType>() {
165-
return Column<T>(
166-
defaultValue: defaultValue as T,
167-
name: name,
168-
);
135+
if (cr.holdsA<Column<int>>()) {
136+
final defaultValue = cr.read('defaultValue').get<int>();
137+
return Column<int>(defaultValue: defaultValue, name: name);
169138
}
170-
171-
if (cr.holdsA<Column>([Text])) {
172-
return columnFactory<Text>();
139+
if (cr.holdsA<Column<bool>>()) {
140+
final defaultValue = cr.read('defaultValue').get<bool>();
141+
return Column<bool>(defaultValue: defaultValue, name: name);
173142
}
174-
if (cr.holdsA<Column>([Real])) {
175-
return columnFactory<Real>();
143+
if (cr.holdsA<Column<String>>()) {
144+
final defaultValue = cr.read('defaultValue').get<String>();
145+
return Column<String>(defaultValue: defaultValue, name: name);
176146
}
177-
if (cr.holdsA<Column>([Integer])) {
178-
return columnFactory<Integer>();
147+
if (cr.holdsA<Column<double>>()) {
148+
final defaultValue = cr.read('defaultValue').get<double>();
149+
return Column<double>(defaultValue: defaultValue, name: name);
179150
}
180-
return columnFactory<Boolean>();
151+
throw ErrorOf<Decoder<Column>>(
152+
message: 'Error reading constant expression.',
153+
expectedState: 'An instance of ConstantReader holding a '
154+
'constant of type `Column`.');
181155
});
182156
183157
final green = AnsiPen()..green(bold: true);
@@ -202,7 +176,8 @@ Future<void> main() async {
202176
// )
203177
204178
// Adding a decoder function for type [Sponsor].
205-
GenericReader.addDecoder<Sponsor>((cr) => Sponsor(cr.read('name').stringValue));
179+
GenericReader.addDecoder<Sponsor>(
180+
(cr) => Sponsor(cr.read('name').stringValue));
206181
207182
final sponsors = sponsorsCR.getList<Sponsor>();
208183
@@ -247,6 +222,14 @@ Future<void> main() async {
247222
// Prints:
248223
// 'Retrieving a Map<String, dynamic>:'
249224
// {one: 1, two: 2.0, enum: Greek.alpha}
225+
226+
// Retrieving a nested list.
227+
// Add a specific decoder for the inner type.
228+
GenericReader.addDecoder<List<int>>((cr) => cr.getList<int>());
229+
230+
final list = listCR.getList<List<int>>();
231+
print(green('\nRetrieving a List<List<int>>'));
232+
print(list);
250233
}
251234
252235
```

example/bin/player_example.dart

Lines changed: 16 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -50,62 +50,30 @@ Future<void> main() async {
5050
final listCR =
5151
ConstantReader(playerLib.classes.first.fields[9].computeConstantValue());
5252

53-
Integer integerDecoder(ConstantReader cr) {
54-
return Integer(cr.read('value').intValue);
55-
}
56-
57-
Real realDecoder(ConstantReader cr) {
58-
return Real(cr.read('value').doubleValue);
59-
}
60-
61-
Boolean booleanDecoder(ConstantReader cr) {
62-
return Boolean(cr.read('value').boolValue);
63-
}
64-
65-
Text textDecoder(ConstantReader cr) {
66-
return Text(cr.read('value').stringValue);
67-
}
68-
69-
SqliteType sqliteTypeDecoder(ConstantReader cr) {
70-
if (cr.holdsA<Integer>()) return cr.get<Integer>();
71-
if (cr.holdsA<Text>()) return cr.get<Text>();
72-
if (cr.holdsA<Real>()) return cr.get<Real>();
73-
if (cr.holdsA<Boolean>()) return cr.get<Boolean>();
74-
throw ErrorOf<Decoder<SqliteType>>(
75-
message: 'Could not reader const value of type `SqliteType`',
76-
invalidState: 'ConstantReader holds a const value of type '
77-
'`${cr.objectValue.type}`.');
78-
}
79-
80-
// Registering decoders.
81-
GenericReader.addDecoder<Integer>(integerDecoder);
82-
GenericReader.addDecoder<Boolean>(booleanDecoder);
83-
GenericReader.addDecoder<Text>(textDecoder);
84-
GenericReader.addDecoder<Real>(realDecoder);
85-
GenericReader.addDecoder<SqliteType>(sqliteTypeDecoder);
86-
8753
// Adding a decoder for constants of type [Column].
8854
GenericReader.addDecoder<Column>((cr) {
89-
final defaultValue = cr.read('defaultValue').get<SqliteType>();
9055
final name = cr.read('name').get<String>();
9156

92-
Column<T> columnFactory<T extends SqliteType>() {
93-
return Column<T>(
94-
defaultValue: defaultValue as T,
95-
name: name,
96-
);
57+
if (cr.holdsA<Column<int>>()) {
58+
final defaultValue = cr.read('defaultValue').get<int>();
59+
return Column<int>(defaultValue: defaultValue, name: name);
9760
}
98-
99-
if (cr.holdsA<Column<Text>>()) {
100-
return columnFactory<Text>();
61+
if (cr.holdsA<Column<bool>>()) {
62+
final defaultValue = cr.read('defaultValue').get<bool>();
63+
return Column<bool>(defaultValue: defaultValue, name: name);
10164
}
102-
if (cr.holdsA<Column<Real>>()) {
103-
return columnFactory<Real>();
65+
if (cr.holdsA<Column<String>>()) {
66+
final defaultValue = cr.read('defaultValue').get<String>();
67+
return Column<String>(defaultValue: defaultValue, name: name);
10468
}
105-
if (cr.holdsA<Column<Integer>>()) {
106-
return columnFactory<Integer>();
69+
if (cr.holdsA<Column<double>>()) {
70+
final defaultValue = cr.read('defaultValue').get<double>();
71+
return Column<double>(defaultValue: defaultValue, name: name);
10772
}
108-
return columnFactory<Boolean>();
73+
throw ErrorOf<Decoder<Column>>(
74+
message: 'Error reading constant expression.',
75+
expectedState: 'An instance of ConstantReader holding a '
76+
'constant of type `Column`.');
10977
});
11078

11179
final green = AnsiPen()..green(bold: true);

example/src/player.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ class Player {
88
final columnName = 'Player';
99

1010
/// Column storing player id.
11-
final id = const Column<Integer>(defaultValue: Integer(1), name: 'id');
11+
final id = const Column<int>(defaultValue: 1, name: 'id');
1212

1313
/// Column storing first name of player.
14-
final firstName = const Column<Text>(
15-
defaultValue: Text('Thomas'),
14+
final firstName = const Column<String>(
15+
defaultValue: 'Thomas',
1616
name: 'FirstName',
1717
);
1818

example/test_types/lib/src/column.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import 'sqlite_type.dart';
21

32
/// TEST CLASS
4-
class Column<T extends SqliteType> {
3+
class Column<T extends Object> {
54
const Column({
65
required this.defaultValue,
76
required this.name,
Lines changed: 11 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,17 @@
1-
import 'package:meta/meta.dart';
1+
/// Enum symbolizing valid Sqlite types.
2+
// ignore_for_file: constant_identifier_names
23

3-
/// Base class of a Sqlite compatible type.
4-
abstract class SqliteType {
5-
const SqliteType._();
6-
}
7-
8-
/// Private class
9-
class _SqliteType<T> extends SqliteType {
10-
const _SqliteType._(this.value) : super._();
11-
final T value;
12-
Type get type => T;
13-
14-
String get sourceCode => '$runtimeType($value)';
15-
16-
@override
17-
String toString() => sourceCode;
18-
19-
@override
20-
bool operator ==(Object other) =>
21-
other is _SqliteType<T> && other.hashCode == hashCode;
4+
enum SqliteType<T> {
5+
INTEGER<int>('INTEGER'),
6+
BOOL<bool>('INTEGER'),
7+
REAL<double>('REAL'),
8+
TEXT<String>('TEXT');
229

23-
@override
24-
int get hashCode => value.hashCode;
25-
}
26-
27-
/// Sqlite type representing [int].
28-
@sealed
29-
class Integer extends _SqliteType<int> {
30-
const Integer(int value) : super._(value);
31-
}
10+
const SqliteType(this.keyword);
3211

33-
/// Sqlite type representing [bool].
34-
@sealed
35-
class Boolean extends _SqliteType<bool> {
36-
const Boolean(bool value) : super._(value);
37-
}
12+
final String keyword;
3813

39-
/// Sqlite type representing [String].
40-
@sealed
41-
class Text extends _SqliteType {
42-
const Text(String value) : super._(value);
43-
@override
44-
String get sourceCode => '$runtimeType(\'$value\')';
45-
}
14+
/// Dart type associated with the Sqlite type.
15+
Type get type => T;
4616

47-
/// Sqlite type representing [double].
48-
@sealed
49-
class Real extends _SqliteType {
50-
const Real(double value) : super._(value);
5117
}

0 commit comments

Comments
 (0)