amzn/style-dictionary

View on GitHub
lib/common/templates/ios/singleton.m.template

Summary

Maintainability
Test Coverage
<%
//
// Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License").
// You may not use this file except in compliance with the License.
// A copy of the License is located at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// or in the "license" file accompanying this file. This file is distributed
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
// express or implied. See the License for the specific language governing
// permissions and limitations under the License.
%>
//
// <%= this.destination %>
//
<%
    // for backward compatibility we need to have the user explicitly hide it
    var showFileHeader = (this.options && this.options.hasOwnProperty('showFileHeader')) ? this.options.showFileHeader : true;
    if(showFileHeader) {
        print("// Do not edit directly\n");
        print("// Generated on " + new Date().toUTCString());
    }
%>
//

#import "<%= this.className %>.h"

@implementation <%= this.className %>

+ (NSDictionary *)getProperty:(NSString *)keyPath {
  return [[self properties] valueForKeyPath:keyPath];
}

+ (nonnull)getValue:(NSString *)keyPath {
  return [[self properties] valueForKeyPath:[NSString stringWithFormat:@"%@.value", keyPath]];
}

+ (NSDictionary *)properties {
  static NSDictionary * dictionary;
  static dispatch_once_t onceToken;

  dispatch_once(&onceToken, ^{
    dictionary = <%= buildDictionary(properties) %>;
  });

  return dictionary;
}

@end

<% function buildDictionary(props, indent) {
  indent = indent || '  ';
  var to_ret = '@{\n';
  if (props.hasOwnProperty('value')) {
    var value = props.attributes.category === 'size' || props.attributes.category === 'time' ? '@' + props.value : props.value;
    to_ret += indent + '@"value": ' + value + ',\n';
    to_ret += indent + '@"name": @"' + props.name + '",\n';

    for(var name in props.attributes) {
      if (props.attributes[name]) {
        to_ret += indent + '@"' + name + '": @"' + props.attributes[name] + '",\n';
      }
    }

    // remove last comma
    return to_ret.slice(0, -2) + '\n' + indent + '}';
  } else {
    for(var name in props) {
      to_ret += indent + '@"' + name + '": ' + buildDictionary(props[name], indent + '  ') + ',\n';
    }
    // remove last comma
    return to_ret.slice(0, -2) + '\n' + indent + '}';
  }
} %>