Support opening/adding a mapping file directly to import it.
[enjoyable.git] / NJMapping.m
index 7df321c..8cc5724 100644 (file)
@@ -8,6 +8,7 @@
 #import "NJMapping.h"
 
 #import "NJInput.h"
+#import "NJOutput.h"
 
 @implementation NJMapping
 
     return success;
 }
 
++ (id)mappingWithContentsOfURL:(NSURL *)url mappings:(NSArray *)mappings error:(NSError **)error {
+    NSInputStream *stream = [NSInputStream inputStreamWithURL:url];
+    [stream open];
+    NSDictionary *serialization = stream && !*error
+        ? [NSJSONSerialization JSONObjectWithStream:stream options:0 error:error]
+        : nil;
+    [stream close];
+    
+    if (!serialization && error)
+        return nil;
+    
+    if (!([serialization isKindOfClass:NSDictionary.class]
+          && [serialization[@"name"] isKindOfClass:NSString.class]
+          && [serialization[@"entries"] isKindOfClass:NSDictionary.class])) {
+        *error = [NSError errorWithDomain:@"Enjoyable"
+                                     code:0
+                              description:@"This isn't a valid mapping file."];
+        return nil;
+    }
+    
+    NSDictionary *entries = serialization[@"entries"];
+    NJMapping *mapping = [[NJMapping alloc] initWithName:serialization[@"name"]];
+    for (id key in entries) {
+        NSDictionary *value = entries[key];
+        if ([key isKindOfClass:NSString.class]) {
+            NJOutput *output = [NJOutput outputDeserialize:value
+                                              withMappings:mappings];
+            if (output)
+                mapping.entries[key] = output;
+        }
+    }
+    return mapping;
+}
+
 @end