From 8f6bac36138d588089ceecee4206773f61283cc5 Mon Sep 17 00:00:00 2001 From: maru Date: Sun, 26 Apr 2020 22:29:36 +0200 Subject: [PATCH] Replace WidgetGenerator sample with NStack sample - Generates a NStack instance - Generate bundled translations --- build.yaml | 17 ++---- example/lib/example.json | 12 ----- example/lib/main.dart | 3 +- example/lib/nstack.json | 4 ++ lib/builder.dart | 5 ++ lib/json_widget.dart | 5 -- lib/nstack.dart | 21 ++++++-- lib/src/builder.dart | 101 ------------------------------------ lib/src/nstack_builder.dart | 43 +++++++++++++++ test/nstack_test.dart | 2 +- 10 files changed, 76 insertions(+), 137 deletions(-) delete mode 100644 example/lib/example.json create mode 100644 example/lib/nstack.json create mode 100644 lib/builder.dart delete mode 100644 lib/json_widget.dart delete mode 100644 lib/src/builder.dart create mode 100644 lib/src/nstack_builder.dart diff --git a/build.yaml b/build.yaml index b2d55f2..4b5eb7c 100644 --- a/build.yaml +++ b/build.yaml @@ -1,20 +1,9 @@ # Read about `build.yaml` at https://pub.dartlang.org/packages/build_config -targets: - $default: - builders: - freezed: - enabled: true - generate_for: - exclude: - - test - - example - include: - - test builders: - jsonWidgetBuilder: - import: "package:nstack/json_widget.dart" - builder_factories: ["jsonWidgetBuilder"] + nstackBuilder: + import: "package:nstack/builder.dart" + builder_factories: ["nstackBuilder"] build_extensions: {".json": [".dart"]} build_to: source auto_apply: dependents \ No newline at end of file diff --git a/example/lib/example.json b/example/lib/example.json deleted file mode 100644 index 0639fdc..0000000 --- a/example/lib/example.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "Container", - "params": { - "color": "#Color(0xFF22DD11)", - "child": { - "name": "Text", - "params": { - "0": "Hello, World" - } - } - } -} \ No newline at end of file diff --git a/example/lib/main.dart b/example/lib/main.dart index a4b3e66..e7b8b31 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:flutter/services.dart'; import 'package:nstack/nstack.dart'; +import 'nstack.dart'; void main() { runApp(MyApp()); @@ -27,7 +28,7 @@ class _MyAppState extends State { String platformVersion; // Platform messages may fail, so we use a try/catch PlatformException. try { - platformVersion = await Nstack.platformVersion; + platformVersion = await NStack.platformVersion; } on PlatformException { platformVersion = 'Failed to get platform version.'; } diff --git a/example/lib/nstack.json b/example/lib/nstack.json new file mode 100644 index 0000000..9f8ebff --- /dev/null +++ b/example/lib/nstack.json @@ -0,0 +1,4 @@ +{ + "nstack_project_id": "123123123", + "nstack_api_key": "abcabcabc" +} \ No newline at end of file diff --git a/lib/builder.dart b/lib/builder.dart new file mode 100644 index 0000000..f968a6c --- /dev/null +++ b/lib/builder.dart @@ -0,0 +1,5 @@ +import 'package:build/build.dart'; +import 'package:nstack/src/nstack_builder.dart'; + +/// Creates a [NstackBuilder] +Builder nstackBuilder(BuilderOptions builderOptions) => const NstackBuilder(); \ No newline at end of file diff --git a/lib/json_widget.dart b/lib/json_widget.dart deleted file mode 100644 index 04cf8fe..0000000 --- a/lib/json_widget.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:build/build.dart'; -import 'package:nstack/src/builder.dart'; - -/// Creates a [JsonWidgetBuilder] -Builder jsonWidgetBuilder(BuilderOptions builderOptions) => const JsonWidgetBuilder(); \ No newline at end of file diff --git a/lib/nstack.dart b/lib/nstack.dart index 4069708..599442c 100644 --- a/lib/nstack.dart +++ b/lib/nstack.dart @@ -2,9 +2,24 @@ import 'dart:async'; import 'package:flutter/services.dart'; -class Nstack { - static const MethodChannel _channel = - const MethodChannel('nstack'); +class NStack { + final String _projectId; + final String _apiKey; + final Map _bundledTranslations; + + NStack._(this._projectId, this._apiKey, this._bundledTranslations); + + static NStack _instance; + + static NStack instance(String projectId, String apiKey, + Map bundledTranslations) { + if (_instance == null) { + _instance = NStack._(projectId, apiKey, bundledTranslations); + } + return _instance; + } + + static const MethodChannel _channel = const MethodChannel('nstack'); static Future get platformVersion async { final String version = await _channel.invokeMethod('getPlatformVersion'); diff --git a/lib/src/builder.dart b/lib/src/builder.dart deleted file mode 100644 index fbb36c1..0000000 --- a/lib/src/builder.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:build/build.dart'; -import 'package:dart_style/dart_style.dart'; -import 'package:meta/meta.dart'; - -/// A builder which outputs widgets from json. -class JsonWidgetBuilder implements Builder { - const JsonWidgetBuilder(); - - @override - FutureOr build(BuildStep buildStep) async { - /// Read the input source and parse it as JSON. - Map source; - final AssetId outputId = buildStep.inputId.changeExtension('.dart'); - try { - source = json.decode(await buildStep.readAsString(buildStep.inputId)); - } catch (err) { - source = { - "name": "Text", - "params": { - "0": "Error: invalid json", - }, - }; - } - final StringBuffer output = StringBuffer(); - // write the header. - output.write(r''' - import 'package:flutter/widgets.dart'; - class GeneratedWidget extends StatelessWidget { - @override - Widget build(BuildContext context) { - return -'''); - WidgetGenerator().visitWidget(source, output); - - // write the footer. - output.write(r''' - ;} - } -'''); - - // Write the results to disk and format it. - String outputString; - // Always output something to keep hot reload working. - try { - outputString = DartFormatter().format(output.toString()).toString(); - } catch (err) { - outputString = 'Text("nstack error formatting")'; - } - await buildStep.writeAsString(outputId, outputString); - } - - @override - Map> get buildExtensions => const { - '.json': ['.dart'] - }; -} - -@visibleForTesting -class WidgetGenerator { - const WidgetGenerator(); - - void visitWidget(Map body, StringBuffer buffer) { - final String name = body['name']; - final Map params = body['params']; - buffer.write("$name("); - for (String key in params.keys) { - if (int.tryParse(key) == null) { - buffer.write("$key: "); - } - visitParameter(params[key], buffer); - buffer.write(','); - } - buffer.write(")"); - } - - void visitParameter(Object parameter, StringBuffer buffer) { - if (parameter is bool) { - buffer.write(parameter); - } else if (parameter is String) { - if (parameter[0] == "#") { - buffer.write(parameter.substring(1)); - } else { - buffer.write('"${parameter}"'); - } - } else if (parameter is num) { - buffer.write(parameter); - } else if (parameter is List) { - buffer.write('['); - for (Object item in parameter) { - visitParameter(item, buffer); - buffer.write(','); - } - buffer.write(']'); - } else if (parameter is Map) { - visitWidget(parameter, buffer); - } - } -} \ No newline at end of file diff --git a/lib/src/nstack_builder.dart b/lib/src/nstack_builder.dart new file mode 100644 index 0000000..120ca74 --- /dev/null +++ b/lib/src/nstack_builder.dart @@ -0,0 +1,43 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:build/build.dart'; + +/// A builder which outputs widgets from json. +class NstackBuilder implements Builder { + const NstackBuilder(); + + @override + FutureOr build(BuildStep buildStep) async { + /// Read the input source and parse it as JSON. + Map input; + String rojectId; + String apiKey; + final AssetId outputId = buildStep.inputId.changeExtension('.dart'); + try { + input = json.decode(await buildStep.readAsString(buildStep.inputId)); + rojectId = input["nstack_project_id"]; // TODO: Validate. + apiKey = input["nstack_api_key"]; // TODO: Validate. + } catch (err) { + // TODO: Inform SDK user about error. + } + final StringBuffer output = StringBuffer(); + output.writeln("// Generated by NStack, do not modify this file."); + output.writeln("import 'package:nstack/nstack.dart';"); + output.writeln(""); + output.writeln("final NStack nstack = NStack.instance(\"$rojectId\", \"$apiKey\", _bundledTranslations);"); + output.writeln(""); + output.writeln(''' +final _bundledTranslations = { + 'en_EN':'{"data":{"section1":{"key1":"value80493753","key2":"value2"}},"meta":{"language":{"id":56,"name":"English","locale":"en_EN","direction":"LRM","is_default":false,"is_best_fit":false},"platform":{"id":447,"slug":"mobile"}}}', + 'fr-BE': '{"data":{"section1":{"key1":"valeur1","key2":"valeur2"}},"meta":{"language":{"id":54,"name":"French (Belgian)","locale":"fr-BE","direction":"LRM","is_default":false,"is_best_fit":false},"platform":{"id":447,"slug":"mobile"}}}', +}; +'''); + await buildStep.writeAsString(outputId, output.toString()); + } + + @override + Map> get buildExtensions => const { + '.json': ['.dart'] + }; +} diff --git a/test/nstack_test.dart b/test/nstack_test.dart index f43d952..3824461 100644 --- a/test/nstack_test.dart +++ b/test/nstack_test.dart @@ -18,6 +18,6 @@ void main() { }); test('getPlatformVersion', () async { - expect(await Nstack.platformVersion, '42'); + expect(await NStack.platformVersion, '42'); }); }