diff --git a/.gitignore b/.gitignore
index fa6ea1d..6d6d856 100644
--- a/.gitignore
+++ b/.gitignore
@@ -72,3 +72,4 @@ doc/api/
# Don't commit pubspec lock file
# (Library packages only! Remove pattern if developing an application package)
pubspec.lock
+/sample_project/lib/src/services/
diff --git a/.idea/runConfigurations/Service.xml b/.idea/runConfigurations/Service.xml
index 525203c..5888795 100644
--- a/.idea/runConfigurations/Service.xml
+++ b/.idea/runConfigurations/Service.xml
@@ -2,6 +2,7 @@
+
\ No newline at end of file
diff --git a/TODO.md b/TODO.md
new file mode 100644
index 0000000..b61b7e6
--- /dev/null
+++ b/TODO.md
@@ -0,0 +1,6 @@
+# Todo
+
+* `schema`
+* `migrate`
+* `build`
+* `deploy`
\ No newline at end of file
diff --git a/bin/angel.dart b/bin/angel.dart
index 3a09559..dff43cd 100644
--- a/bin/angel.dart
+++ b/bin/angel.dart
@@ -14,9 +14,8 @@ main(List args) {
runner.addCommand(new DoctorCommand());
runner.addCommand(new ServiceCommand());
- return runner.run(args).then((_) {}).catchError((exc, st) {
+ return runner.run(args).then((_) {}).catchError((exc) {
stderr.writeln("Oops, something went wrong: $exc");
- stderr.writeln(st);
exitCode = 1;
});
}
diff --git a/lib/src/commands/service.dart b/lib/src/commands/service.dart
index 57355a7..5e8a1c0 100644
--- a/lib/src/commands/service.dart
+++ b/lib/src/commands/service.dart
@@ -1,3 +1,4 @@
+import "dart:io";
import "package:args/command_runner.dart";
import "package:console/console.dart";
import "package:mustache4dart/mustache4dart.dart";
@@ -6,6 +7,8 @@ class ServiceCommand extends Command {
final String CUSTOM = "Custom";
final String MEMORY = "In-Memory";
final String MONGO = "MongoDB";
+ final String MONGO_TYPED = "MongoDB (typed)";
+ final String TRESTLE = "Trestle";
final TextPen _pen = new TextPen();
@override String get name => "service";
@@ -16,10 +19,9 @@ class ServiceCommand extends Command {
@override
run() async {
var name = await readInput("Name of Service (not plural): ");
- var chooser = new Chooser([MONGO, MEMORY, CUSTOM],
+ var chooser = new Chooser([TRESTLE, MONGO, MONGO_TYPED, MEMORY, CUSTOM],
message: "What type of service would you like to create? ");
var type = await chooser.choose();
- print("Creating $type service $name");
fail() {
_pen.red();
@@ -31,19 +33,84 @@ class ServiceCommand extends Command {
if (type == MONGO) {
serviceSource = _generateMongoService(name);
- } else fail();
+ } else if (type == MONGO_TYPED) {
+ _pen.blue();
+ _pen("${Icon.STAR} To create a typed Mongo service, please create a schema using 'angel schema'.");
+ _pen();
+ } else if (type == MEMORY) {
+ serviceSource = _generateMemoryService(name);
+ } else if (type == CUSTOM) {
+ serviceSource = _generateCustomService(name);
+ } else if (type == TRESTLE) {
+ _pen.blue();
+ _pen("${Icon.STAR} Trestle services are not yet implemented. :(");
+ _pen();
+ } else {
+ print("Code to generate a $type service is not yet written.");
+ }
- print("Generated source: ");
- print(serviceSource);
+ if (serviceSource.isEmpty) {
+ if (type == MONGO_TYPED)
+ return;
+
+ fail();
+ throw new Exception("Empty generated service code.");
+ }
+
+ var servicesDir = new Directory("lib/src/services");
+ var serviceFile = new File.fromUri(servicesDir.uri.resolve("${name.toLowerCase()}.dart"));
+ var serviceLibrary = new File.fromUri(
+ servicesDir.uri.resolve("services.dart"));
+
+ if (!await servicesDir.exists())
+ await servicesDir.create(recursive: true);
+
+ await serviceFile.writeAsString(serviceSource);
+ await serviceLibrary.writeAsString(
+ "\nexport '${name.toLowerCase()}.dart';", mode: FileMode.APPEND);
+
+ _pen.green();
+ _pen("${Icon.CHECKMARK} Successfully generated service $name.");
+ _pen();
+ }
+
+ _generateCustomService(String name) {
+ return '''
+import 'package:angel_framework/angel_framework.dart';
+
+class ${name}Service extends Service {
+ ${name}Service():super() {
+ // Your logic here!
+ }
+}
+ '''.trim();
+ }
+
+ _generateMemoryService(String name) {
+ return '''
+import 'package:angel_framework/defs.dart';
+import 'package:angel_framework/angel_framework.dart';
+
+/// Store in-memory instances of this class.
+class $name extends MemoryModel {
+}
+
+/// Manages [$name] in-memory.
+class ${name}Service extends MemoryService<$name> {
+ ${name}Service():super() {
+ // Your logic here!
+ }
+}
+ '''.trim();
}
_generateMongoService(String name) {
return '''
-import "package:angel_mongo/angel_mongo.dart";
+import 'package:angel_mongo/angel_mongo.dart';
class ${name}Service extends MongoService {
${name}Service(collection):super(collection) {
- print("YEET");
+ // Your logic here!
}
}
'''.trim();
diff --git a/sample_project/pubspec.yaml b/sample_project/pubspec.yaml
new file mode 100644
index 0000000..863d07e
--- /dev/null
+++ b/sample_project/pubspec.yaml
@@ -0,0 +1,5 @@
+name: sample_project
+publish_to: none
+dependencies:
+ angel_framework: ^1.0.0-dev
+ angel_mongo: ^1.0.0-dev
\ No newline at end of file
diff --git a/sample_project/sample_project.dart b/sample_project/sample_project.dart
new file mode 100644
index 0000000..e4adb20
--- /dev/null
+++ b/sample_project/sample_project.dart
@@ -0,0 +1,11 @@
+import "dart:async";
+import "dart:io";
+import "package:angel_framework/angel_framework.dart";
+import "package:sample_project/src/services/services.dart";
+
+class SampleServer extends Angel {
+ @override
+ startServer(address, port) async {
+ return await super.startServer(address, port);
+ }
+}
\ No newline at end of file