Improve logs (#87)

* Added fallback to flutter format if dartfmt is not found

* added red color for severe, green for success in log printing

* Only catch ProcessException when calling dartfmt

* used package:cli_utils for finding dart_sdk and ansi colors

* use path.join
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5db8023..5fc842d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+# 0.2.3+2
+- Handle code formatting using dartfmt by finding dart-sdk.
+
 # 0.2.3+1
 - Fixed missing typedefs of nested function pointers.
 
diff --git a/bin/ffigen.dart b/bin/ffigen.dart
index d0b2ee1..74021be 100644
--- a/bin/ffigen.dart
+++ b/bin/ffigen.dart
@@ -6,6 +6,7 @@
 import 'dart:io';
 
 import 'package:args/args.dart';
+import 'package:cli_util/cli_logging.dart' show Ansi;
 import 'package:ffigen/ffigen.dart';
 import 'package:logging/logging.dart';
 import 'package:yaml/yaml.dart' as yaml;
@@ -13,6 +14,15 @@
 import 'setup.dart';
 
 var _logger = Logger('ffigen.ffigen');
+final _ansi = Ansi(Ansi.terminalSupportsAnsi);
+
+String successPen(String str) {
+  return '${_ansi.green}$str${_ansi.none}';
+}
+
+String errorPen(String str) {
+  return '${_ansi.red}$str${_ansi.none}';
+}
 
 void main(List<String> args) {
   // Parses the cmd args. This will print usage and exit if --help was passed.
@@ -45,7 +55,8 @@
   // Generate file for the parsed bindings.
   final gen = File(config.output);
   library.generateFile(gen);
-  _logger.info('Finished, Bindings generated in ${gen?.absolute?.path}');
+  _logger.info(
+      successPen('Finished, Bindings generated in ${gen?.absolute?.path}'));
 }
 
 Config getConfig(ArgResults result) {
@@ -173,16 +184,27 @@
     }
     // Setup logger for printing (if verbosity was set by user).
     Logger.root.onRecord.listen((record) {
-      print('${record.level.name.padRight(8)}: ${record.message}');
+      final level = '[${record.level.name}]'.padRight(9);
+      printLog('${level}: ${record.message}', record.level);
     });
   } else {
     // Setup logger for printing (if verbosity was not set by user).
     Logger.root.onRecord.listen((record) {
       if (record.level.value > Level.INFO.value) {
-        print('  ${record.level.name.padRight(8)}: ${record.message}');
+        final level = '[${record.level.name}]'.padRight(9);
+        printLog('${level}: ${record.message}', record.level);
       } else {
-        print(record.message);
+        printLog(record.message, record.level);
       }
     });
   }
 }
+
+void printLog(String log, Level level) {
+  // Prints text in red for Severe logs only.
+  if (level < Level.SEVERE) {
+    print(log);
+  } else {
+    print(errorPen(log));
+  }
+}
diff --git a/lib/src/code_generator/library.dart b/lib/src/code_generator/library.dart
index 10b73a9..9503ee6 100644
--- a/lib/src/code_generator/library.dart
+++ b/lib/src/code_generator/library.dart
@@ -4,9 +4,10 @@
 
 import 'dart:io';
 
+import 'package:cli_util/cli_util.dart';
 import 'package:logging/logging.dart';
 import 'package:meta/meta.dart';
-
+import 'package:path/path.dart' as p;
 import 'binding.dart';
 import 'utils.dart';
 import 'writer.dart';
@@ -93,10 +94,15 @@
 
   /// Formats a file using `dartfmt`.
   void _dartFmt(String path) {
-    final result = Process.runSync('dartfmt', ['-w', path],
-        runInShell: Platform.isWindows);
-    if (result.stderr.toString().isNotEmpty) {
-      _logger.severe(result.stderr);
+    final dartFmt = p.join(getSdkPath(), 'bin', 'dartfmt');
+    try {
+      final result = Process.runSync(dartFmt, ['-w', path],
+          runInShell: Platform.isWindows);
+      if (result.stderr.toString().isNotEmpty) {
+        _logger.severe(result.stderr);
+      }
+    } on ProcessException {
+      _logger.severe("Couldn't format bindings, unable to call $dartFmt.");
     }
   }
 
diff --git a/pubspec.yaml b/pubspec.yaml
index f87d8eb..1db827c 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,7 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 name: ffigen
-version: 0.2.3+1
+version: 0.2.3+2
 homepage: https://github.com/dart-lang/ffigen
 description: Experimental generator for FFI bindings, using LibClang to parse C/C++ header files.
 
@@ -16,6 +16,7 @@
   meta: ^1.1.8
   args: ^1.6.0
   logging: ^0.11.4
+  cli_util: ^0.2.0
   glob: ^1.2.0
   path: ^1.7.0
   quiver: ^2.1.3