X-Git-Url: https://git.yukkurigames.com/?p=enjoyable.git;a=blobdiff_plain;f=NJMapping.m;h=8cc572407945ac02b21a1171123e94e884a16995;hp=a5f810ccd57b2ad20050f095056f5f7b6b3a04d9;hb=0c8d013560e2642c278390dffc9bb63b3b145dea;hpb=e2a4d830dd9817f6a515a3b1b6aa152d3bb98c2b diff --git a/NJMapping.m b/NJMapping.m index a5f810c..8cc5724 100644 --- a/NJMapping.m +++ b/NJMapping.m @@ -8,6 +8,7 @@ #import "NJMapping.h" #import "NJInput.h" +#import "NJOutput.h" @implementation NJMapping @@ -19,14 +20,14 @@ return self; } -- (Target *)objectForKeyedSubscript:(NJInput *)input { +- (NJOutput *)objectForKeyedSubscript:(NJInput *)input { return input ? _entries[input.uid] : nil; } -- (void)setObject:(Target *)target forKeyedSubscript:(NJInput *)input { +- (void)setObject:(NJOutput *)output forKeyedSubscript:(NJInput *)input { if (input) { - if (target) - _entries[input.uid] = target; + if (output) + _entries[input.uid] = output; else [_entries removeObjectForKey:input.uid]; } @@ -42,4 +43,49 @@ return @{ @"name": _name, @"entries": entries }; } +- (BOOL)writeToURL:(NSURL *)url error:(NSError **)error { + [NSProcessInfo.processInfo disableSuddenTermination]; + NSDictionary *serialization = [self serialize]; + NSData *json = [NSJSONSerialization dataWithJSONObject:serialization + options:NSJSONWritingPrettyPrinted + error:error]; + BOOL success = json && [json writeToURL:url options:NSDataWritingAtomic error:error]; + [NSProcessInfo.processInfo enableSuddenTermination]; + 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