Skip to content

Commit 4ab0f97

Browse files
committed
Update
1 parent 6c7e146 commit 4ab0f97

File tree

8 files changed

+347
-20
lines changed

8 files changed

+347
-20
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
//.title
2+
// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
3+
//
4+
// Dart/Flutter (DF) Packages by DevCetra.com & contributors. See LICENSE file
5+
// in root directory.
6+
//
7+
// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
8+
//.title~
9+
10+
import 'package:analyzer/dart/constant/value.dart';
11+
import 'package:df_generate_dart_models_core/df_generate_dart_models_core.dart';
12+
13+
import 'dart_obj_to_list.dart';
14+
15+
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
16+
17+
extension DartFromRecordOnDartObjectX on DartObject {
18+
//
19+
//
20+
//
21+
22+
/// Returns `fieldName` property from `this` [DartObject] record if it matches
23+
/// the structure of [TFieldRecord] or `null`.
24+
List<String>? fieldPathFromRecord() {
25+
return this
26+
._rawFieldPathFromRecord()
27+
?.map((e) => e.replaceAll('?', ''))
28+
.toList();
29+
}
30+
31+
List<String>? _rawFieldPathFromRecord() {
32+
final a = dartObjToList(this.getField('\$1'));
33+
final b = dartObjToList(this.getField(FieldModelFieldNames.fieldPath));
34+
return (a ?? b)?.toList();
35+
}
36+
37+
//
38+
//
39+
//
40+
41+
/// Returns `fieldType` property from `this` DartObject record if it matches
42+
/// the structure of [TFieldRecord] or `null`.
43+
String? fieldTypeFromRecord() {
44+
final raw = this._rawFieldTypeFromRecord();
45+
if (raw != null) {
46+
return raw.endsWith('?') ? raw.substring(0, raw.length - 1) : raw;
47+
}
48+
return null;
49+
}
50+
51+
String? _rawFieldTypeFromRecord() {
52+
final a = this.getField('\$2')?.toStringValue();
53+
final b = this.getField('\$2')?.toTypeValue()?.getDisplayString();
54+
final c = this.getField(FieldModelFieldNames.fieldType)?.toStringValue();
55+
final d = this
56+
.getField(FieldModelFieldNames.fieldType)
57+
?.toTypeValue()
58+
?.getDisplayString();
59+
return a ?? b ?? c ?? d;
60+
}
61+
62+
//
63+
//
64+
//
65+
66+
/// Returns `nullable` property from the `this` [DartObject] record if it
67+
/// matches the structure of [TFieldRecord] or `null`.
68+
bool? nullableFromRecord() {
69+
if (this.fieldTypeFromRecord() == 'dynamic') {
70+
return false;
71+
}
72+
73+
final a = this.getField(FieldModelFieldNames.nullable)?.toBoolValue();
74+
final b = this.getField('\$3')?.toBoolValue();
75+
final c = this._rawFieldPathFromRecord()?.any((e) => e.contains('?'));
76+
final d = this._rawFieldTypeFromRecord()?.endsWith('?');
77+
return a ?? b ?? ((c ?? false) || (d ?? false));
78+
}
79+
}

lib/src/dart_obj_to_list.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//.title
2+
// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
3+
//
4+
// Dart/Flutter (DF) Packages by DevCetra.com & contributors. See LICENSE file
5+
// in root directory.
6+
//
7+
// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
8+
//.title~
9+
10+
import 'package:analyzer/dart/constant/value.dart';
11+
import 'package:df_type/df_type.dart';
12+
13+
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
14+
15+
List<String>? dartObjToList(DartObject? obj) {
16+
return (letListOrNull<String>(obj?.toStringValue()) ??
17+
obj?.toListValue()?.map((e) => e.toStringValue()))
18+
?.nonNulls
19+
.toList();
20+
}

lib/src/generate_screen_access/_extract_class_insights_from_dart_file.dart

Lines changed: 117 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,38 @@
88
//.title~
99

1010
import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
11+
import 'package:df_generate_dart_models_core/df_generate_dart_models_core.dart';
12+
1113
import 'package:path/path.dart' as p;
1214
import 'package:df_gen_core/df_gen_core.dart';
15+
import 'package:df_screen_core/df_screen_core.dart';
16+
17+
import '../dart_from_record_on_dart_object_x.dart';
1318

1419
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
1520

1621
Future<List<_ClassInsight>> extractClassInsightsFromDartFile(
1722
AnalysisContextCollection analysisContextCollection,
1823
String filePath,
1924
) async {
25+
late ModelGenerateScreenBindings temp;
2026
final analyzer = DartAnnotatedClassAnalyzer(
2127
filePath: filePath,
2228
analysisContextCollection: analysisContextCollection,
2329
);
2430

2531
final insights = <_ClassInsight>[];
2632
await analyzer.analyze(
27-
inclClassAnnotations: {'GenerateScreenBindings'},
33+
inclClassAnnotations: {ModelGenerateScreenBindings.CLASS_NAME},
34+
onClassAnnotationField: (p) async => temp = _updateFromClassAnnotationField(temp, p),
35+
onPreAnalysis: (_, className) => temp = const ModelGenerateScreenBindings(),
2836
onPostAnalysis: (params) {
2937
final fullPathName = params.fullFilePath;
3038
final fileName = p.basename(fullPathName);
3139
final dirPath = p.dirname(fullPathName);
3240
final insight = _ClassInsight(
3341
className: params.className,
34-
annotation: null,
42+
annotation: temp,
3543
dirPath: dirPath,
3644
fileName: fileName,
3745
);
@@ -43,4 +51,110 @@ Future<List<_ClassInsight>> extractClassInsightsFromDartFile(
4351

4452
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
4553

46-
typedef _ClassInsight = ClassInsight<Null>;
54+
ModelGenerateScreenBindings _updateFromClassAnnotationField(
55+
ModelGenerateScreenBindings annotation,
56+
OnClassAnnotationFieldParams params,
57+
) {
58+
switch (params.fieldName) {
59+
case ModelGenerateScreenBindingsFieldNames.args:
60+
return annotation.copyWith(
61+
ModelGenerateScreenBindings(
62+
args: params.fieldValue.toMapValue()?.map(
63+
(k, v) => MapEntry(k?.toStringValue(), v?.toStringValue()),
64+
),
65+
),
66+
);
67+
case ModelGenerateScreenBindingsFieldNames.isAccessibleOnlyIfLoggedInAndVerified:
68+
return annotation.copyWith(
69+
ModelGenerateScreenBindings(
70+
isAccessibleOnlyIfLoggedInAndVerified: params.fieldValue.toBoolValue(),
71+
),
72+
);
73+
case ModelGenerateScreenBindingsFieldNames.isAccessibleOnlyIfLoggedIn:
74+
return annotation.copyWith(
75+
ModelGenerateScreenBindings(
76+
isAccessibleOnlyIfLoggedIn: params.fieldValue.toBoolValue(),
77+
),
78+
);
79+
case ModelGenerateScreenBindingsFieldNames.isAccessibleOnlyIfLoggedOut:
80+
return annotation.copyWith(
81+
ModelGenerateScreenBindings(
82+
isAccessibleOnlyIfLoggedOut: params.fieldValue.toBoolValue(),
83+
),
84+
);
85+
case ModelGenerateScreenBindingsFieldNames.isRedirectable:
86+
return annotation.copyWith(
87+
ModelGenerateScreenBindings(
88+
isRedirectable: params.fieldValue.toBoolValue(),
89+
),
90+
);
91+
case ModelGenerateScreenBindingsFieldNames.path:
92+
return annotation.copyWith(
93+
ModelGenerateScreenBindings(
94+
path: params.fieldValue.toStringValue(),
95+
),
96+
);
97+
case ModelGenerateScreenBindingsFieldNames.queryParameters:
98+
return annotation.copyWith(
99+
ModelGenerateScreenBindings(
100+
queryParameters: {
101+
...?annotation.queryParameters,
102+
...?params.fieldValue.toSetValue()?.map((e) {
103+
final field = FieldModel(
104+
fieldPath: e.fieldPathFromRecord()!,
105+
fieldType: e.fieldTypeFromRecord()!,
106+
nullable: e.nullableFromRecord()!,
107+
);
108+
return field.toRecord;
109+
}),
110+
},
111+
),
112+
);
113+
case ModelGenerateScreenBindingsFieldNames.internalParameters:
114+
return annotation.copyWith(
115+
ModelGenerateScreenBindings(
116+
internalParameters: {
117+
...?annotation.internalParameters,
118+
...?params.fieldValue.toSetValue()?.map((e) {
119+
final field = FieldModel(
120+
fieldPath: e.fieldPathFromRecord()!,
121+
fieldType: e.fieldTypeFromRecord()!,
122+
nullable: e.nullableFromRecord()!,
123+
);
124+
return field.toRecord;
125+
}),
126+
},
127+
),
128+
);
129+
case ModelGenerateScreenBindingsFieldNames.title:
130+
return annotation.copyWith(
131+
ModelGenerateScreenBindings(
132+
title: params.fieldValue.toStringValue(),
133+
),
134+
);
135+
case ModelGenerateScreenBindingsFieldNames.className:
136+
return annotation.copyWith(
137+
ModelGenerateScreenBindings(
138+
className: params.fieldValue.toStringValue(),
139+
),
140+
);
141+
case ModelGenerateScreenBindingsFieldNames.screenKey:
142+
return annotation.copyWith(
143+
ModelGenerateScreenBindings(
144+
screenKey: params.fieldValue.toStringValue(),
145+
),
146+
);
147+
case ModelGenerateScreenBindingsFieldNames.keyStringCase:
148+
return annotation.copyWith(
149+
ModelGenerateScreenBindings(
150+
keyStringCase: params.fieldValue.toStringValue(),
151+
),
152+
);
153+
default:
154+
}
155+
return ModelGenerateScreenBindings.of(annotation);
156+
}
157+
158+
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
159+
160+
typedef _ClassInsight = ClassInsight<ModelGenerateScreenBindings>;

lib/src/generate_screen_access/app.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ Future<void> generateScreenAccessApp(List<String> args) async {
8383
);
8484
}
8585

86+
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
87+
8688
class _ArgsChecker extends ValidArgsChecker {
8789
//
8890
//

lib/src/generate_screen_access/generator.dart

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,15 @@ Future<void> generateScreenAccess({
4444
);
4545
final sourceFileExplorerResults = await sourceFileExporer.explore();
4646

47-
// final template = extractCodeFromMarkdown(
48-
// await loadFileFromGitHub(
49-
// username: 'robmllze',
50-
// repo: 'df_generate_screen',
51-
// filePath: [
52-
// templateFilePath ?? 'templates/screen_access.dart.md',
53-
// ].join('/'),
54-
// ),
55-
// );
47+
final template = extractCodeFromMarkdown(
48+
await loadFileFromGitHub(
49+
username: 'robmllze',
50+
repo: 'df_generate_screen',
51+
filePath: [
52+
templateFilePath ?? 'templates/access.dart.md',
53+
].join('/'),
54+
),
55+
);
5656

5757
// ---------------------------------------------------------------------------
5858

@@ -63,8 +63,8 @@ Future<void> generateScreenAccess({
6363
);
6464

6565
// For each file...
66-
for (final filePathResult in sourceFileExplorerResults.filePathResults
67-
.where((e) => e.category == _Categories.DART)) {
66+
for (final filePathResult
67+
in sourceFileExplorerResults.filePathResults.where((e) => e.category == _Categories.DART)) {
6868
final filePath = filePathResult.path;
6969

7070
// Extract insights from the file.

pubspec.yaml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,20 @@ dependencies:
2828
df_log: ^0.1.2
2929
df_string: ^0.1.1
3030
df_type: ^0.1.4
31+
df_generate_dart_models_core: ^0.2.1
3132
path: ^1.9.0
3233

34+
df_screen_core:
35+
git:
36+
url: https://github.com/robmllze/df_screen_core
37+
ref: main
38+
3339
## -----------------------------------------------------------------------------
3440

3541
dev_dependencies:
3642
lints: ^4.0.0
3743
test: ^1.25.8
3844

39-
df_screen:
40-
git:
41-
url: https://github.com/robmllze/df_screen
42-
ref: main
43-
4445
## -----------------------------------------------------------------------------
4546

4647
executables:

0 commit comments

Comments
 (0)