[stream close];
if (!([serialization isKindOfClass:NSDictionary.class]
- && serialization[@"entries"])) {
+ && [serialization[@"name"] isKindOfClass:NSString.class]
+ && [serialization[@"entries"] isKindOfClass:NSDictionary.class])) {
*error = [NSError errorWithDomain:@"Enjoyable"
- code:0
- description:@"This isn't a valid mapping file."];
+ code:0
+ description:@"This isn't a valid mapping file."];
return nil;
}
NSDictionary *entries = serialization[@"entries"];
Config *cfg = [[Config alloc] initWithName:serialization[@"name"]];
- for (id key in entries)
- cfg.entries[key] = [Target targetDeserialize:entries[key]
- withConfigs:_configs];
+ for (id key in entries) {
+ NSDictionary *value = entries[key];
+ if ([key isKindOfClass:NSString.class]) {
+ Target *target = [Target targetDeserialize:value
+ withConfigs:_configs];
+ if (target)
+ cfg.entries[key] = target;
+ }
+ }
return cfg;
}
}
if (error) {
- [[NSAlert alertWithError:error] beginSheetModalForWindow:window
- modalDelegate:nil
- didEndSelector:nil
- contextInfo:nil];
+ [window presentError:error
+ modalForWindow:window
+ delegate:nil
+ didPresentSelector:nil
+ contextInfo:nil];
}
}];
NSWindow *window = NSApplication.sharedApplication.keyWindow;
[panel beginSheetModalForWindow:window
completionHandler:^(NSInteger result) {
- if (result == NSFileHandlingPanelOKButton) {
- NSError *error;
- NSDictionary *serialization = [cfg serialize];
- NSData *json = [NSJSONSerialization dataWithJSONObject:serialization
- options:NSJSONWritingPrettyPrinted
- error:&error];
- if (!error)
- [json writeToURL:panel.URL options:NSDataWritingAtomic error:&error];
-
- if (error) {
- // FIXME: Ideally, this sheet is attached to the
- // panel, and the panel doesn't close, so you
- // can maybe fix what is wrong and try saving
- // again. But it seems to be impossible to force
- // the panel to stay open.
- [panel close];
- [[NSAlert alertWithError:error] beginSheetModalForWindow:window
- modalDelegate:nil
- didEndSelector:nil
- contextInfo:nil];
- }
+ if (result != NSFileHandlingPanelOKButton)
+ return;
+ [panel close];
+ NSError *error;
+ NSDictionary *serialization = [cfg serialize];
+ NSData *json = [NSJSONSerialization dataWithJSONObject:serialization
+ options:NSJSONWritingPrettyPrinted
+ error:&error];
+ if (!error)
+ [json writeToURL:panel.URL options:NSDataWritingAtomic error:&error];
+
+ if (error) {
+ [window presentError:error
+ modalForWindow:window
+ delegate:nil
+ didPresentSelector:nil
+ contextInfo:nil];
}
}];
}