X-Git-Url: https://git.yukkurigames.com/?p=enjoyable.git;a=blobdiff_plain;f=NJMapping.m;h=8cc572407945ac02b21a1171123e94e884a16995;hp=7df321ce232a0da3e96806464fa7cf00cea77be5;hb=5c488091214f1aca932fa74623e024a4d0c245a2;hpb=b18839d1b922bcf00b5ada21e1748b6d78c6773f diff --git a/NJMapping.m b/NJMapping.m index 7df321c..8cc5724 100644 --- a/NJMapping.m +++ b/NJMapping.m @@ -8,6 +8,7 @@ #import "NJMapping.h" #import "NJInput.h" +#import "NJOutput.h" @implementation NJMapping @@ -53,4 +54,38 @@ 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