def generate_manager_implementation(self):
        if self.objc_manager_or_none is None:
            return

        objc_manager = self.objc_manager_or_none

        file_name = 'LCC{0}Manager.mm'.format(self.class_name)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name
        output_impl = open(file_path, 'w')

        output_impl.write('#if !defined(__has_feature) || !__has_feature(objc_arc)\n#error "This file requires ARC support."\n#endif')
        output_impl.write(_OBJC_BR)
        output_impl.write('#import "LCC{0}Manager.h"\n#import "LCC{0}Manager_CoreAddition.h"\n\n'.format(self.class_name))
        output_impl.write('#import "LCCDirector.h"\n#import "LCCObjcAdapter.h"\n#import "LCCUtils.h"\n\n')
        output_impl.write('#import "LCC{0}.h"\n#import "LCC{0}_CoreAddition.h"'.format(self.class_name))
        output_impl.write(_OBJC_BR)
        output_impl.write('@implementation LCC{0}Manager'.format(self.class_name))
        output_impl.write(_OBJC_BR)
        output_impl.write('#pragma mark - Lifecycle')
        output_impl.write(_OBJC_BR)
        output_impl.write(objc_manager.generate_constructor_implementation())
        output_impl.write(_OBJC_BR)
        output_impl.write(objc_manager.generate_default_manager_implementation())
        output_impl.write(_OBJC_BR)
        output_impl.write('#pragma mark - HTTP')
        output_impl.write(_OBJC_BR)
        output_impl.write(objc_manager.generate_web_api_implementations())
        output_impl.write('#pragma mark - Persistent store')
        output_impl.write(_OBJC_BR)
        output_impl.write(objc_manager.generate_fetch_implementations())
        output_impl.write('@end\n')
Esempio n. 2
0
    def generate_core_addition_header(self, config):
        """Generates Objective-C++ private header file. (eg: LCCTopic_CoreAddition.h)

        Args:
            config: A <Config> object represents user-defined configs, in this method, only apple/prefix is used.
        """
        file_name = '{1}{0}_CoreAddition.h'.format(self.class_name, config.objc_prefix)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name
        output_header = open(file_path, 'w')

        output_header.write('#include "{0}.h"'.format(cpp_class_name_to_cpp_file_name(self.class_name)))
        output_header.write(_OBJC_BR)
        output_header.write('@interface {1}{0} () {{'.format(self.class_name, config.objc_prefix))
        output_header.write('\n')
        output_header.write(' @package')
        output_header.write('\n')
        output_header.write(_OBJC_SPACE)
        output_header.write('std::unique_ptr<{1}::{0}> _coreHandle;'.format(self.class_name, config.cpp_namespace))
        output_header.write('\n')
        output_header.write('}')
        output_header.write(_OBJC_BR)
        output_header.write('+ (instancetype){0}WithCore{1}:(const {2}::{1}&)core{1};'
                            .format(string_utils.first_char_to_lower(self.class_name),
                                    self.class_name,
                                    config.cpp_namespace))
        output_header.write(_OBJC_BR)
        output_header.write('@end')
Esempio n. 3
0
    def generate_header(self, config):
        """Generates Objective-C++ object header file.

        Args:
            config: A <Config> object represents user-defined configs, in this method, only apple/prefix is used.
        """

        file_name = '{1}{0}.h'.format(self.class_name, config.objc_prefix)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name
        output_header = open(file_path, 'w')

        output_header.write('#import <Foundation/Foundation.h>')
        output_header.write(_OBJC_BR)

        for objc_enum in self.objc_enum_list:
            output_header.write(objc_enum.generate_objc_enum(self.class_name, config))
            output_header.write(_OBJC_BR)

        output_header.write('NS_ASSUME_NONNULL_BEGIN\n@interface {1}{0} : NSObject'.format(self.class_name,
                                                                                           config.objc_prefix))
        output_header.write(_OBJC_BR)

        for objc_var in self.objc_var_list:
            output_header.write(objc_var.property(config))
            output_header.write(_OBJC_BR)

        output_header.write('@end\nNS_ASSUME_NONNULL_END')
        output_header.write(_OBJC_BR)
    def generate_implementation(self):
        file_name = 'LCC{0}.mm'.format(self.class_name)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name
        output_impl = open(file_path, 'w')

        output_impl.write('#if !defined(__has_feature) || !__has_feature(objc_arc)\n#error "This file requires ARC support."\n#endif')
        output_impl.write(_OBJC_BR)
        output_impl.write('#import "LCC{0}.h"\n#import "LCC{0}_CoreAddition.h"\n\n#import "LCCObjcAdapter.h"'.format(self.class_name))
        output_impl.write(_OBJC_BR)
        output_impl.write('@implementation LCC{0}'.format(self.class_name))
        output_impl.write(_OBJC_BR)
        output_impl.write('#pragma mark - Property')
        output_impl.write(_OBJC_BR)

        for objc_var in self.objc_var_list:
            output_impl.write(objc_var.getter_impl())
            output_impl.write(_OBJC_BR)
            output_impl.write(objc_var.setter_impl())
            output_impl.write(_OBJC_BR)

        output_impl.write('#pragma mark - Core Addition')
        output_impl.write(_OBJC_BR)
        output_impl.write('+ (instancetype){0}WithCore{1}:(const lesschat::{1}&)core{1} {{\n'
                          .format(string_utils.first_char_to_lower(self.class_name), self.class_name))
        output_impl.write(_OBJC_SPACE)
        output_impl.write('LCC{0} *{1} = [[LCC{0} alloc] init];\n'.format(self.class_name, string_utils.first_char_to_lower(self.class_name)))
        output_impl.write(_OBJC_SPACE)
        output_impl.write('{0}->_coreHandle = core{1}.Clone();\n'.format(string_utils.first_char_to_lower(self.class_name), self.class_name))
        output_impl.write(_OBJC_SPACE)
        output_impl.write('return {0};\n}}'.format(string_utils.first_char_to_lower(self.class_name)))
        output_impl.write(_OBJC_BR)
        output_impl.write('@end\n')
    def generate_core_addition_header(self):
        file_name = 'LCC{0}_CoreAddition.h'.format(self.class_name)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(
            self.group_name) + '/' + file_name
        output_header = open(file_path, 'w')

        output_header.write('#include "{0}.h"'.format(
            cpp_class_name_to_cpp_file_name(self.class_name)))
        output_header.write(_OBJC_BR)
        output_header.write('@interface LCC{0} () {{'.format(self.class_name))
        output_header.write('\n')
        output_header.write('@package')
        output_header.write('\n')
        output_header.write(_OBJC_SPACE)
        output_header.write(
            'std::unique_ptr<lesschat::{0}> _coreHandle;'.format(
                self.class_name))
        output_header.write('\n')
        output_header.write('}')
        output_header.write(_OBJC_BR)
        output_header.write(
            '+ (instancetype){0}WithCore{1}:(const lesschat::{1}&)core{1};'.
            format(string_utils.first_char_to_lower(self.class_name),
                   self.class_name))
        output_header.write(_OBJC_BR)
        output_header.write('@end')
    def generate_manager_core_addition_header(self):
        file_name = 'LCC{0}Manager_CoreAddition.h'.format(self.class_name)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name
        output_header = open(file_path, 'w')

        output_header.write('#include "{0}_manager.h"\n#include "director.h"'.format(string_utils.cpp_class_name_to_cpp_file_name(self.class_name)))
        output_header.write(_OBJC_BR)
        output_header.write('@interface LCC{0}Manager () {{\n@private\n'.format(self.class_name))
        output_header.write(_OBJC_SPACE)
        output_header.write('const lesschat::{0}Manager *_coreManagerHandler;\n'.format(self.class_name))
        output_header.write('}')
        output_header.write(_OBJC_BR)
        output_header.write('@end\n')
Esempio n. 7
0
    def generate_manager_header(self, config):
        """Generates Objective-C++ object manager header file.

        Args:
            config: A <Config> object represents user-defined configs, in this method, only apple/prefix is used.
        """
        if self.objc_manager_or_none is None:
            return

        objc_manager = self.objc_manager_or_none

        file_name = '{1}{0}Manager.h'.format(self.class_name, config.objc_prefix)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name
        output_header = open(file_path, 'w')

        output_header.write('#import <Foundation/Foundation.h>')
        output_header.write(_OBJC_BR)
        output_header.write('@class {1}{0};'.format(self.class_name, config.objc_prefix))
        output_header.write(_OBJC_BR)

        output_header.write('NS_ASSUME_NONNULL_BEGIN\n')
        output_header.write('@interface {1}{0}Manager : NSObject'.format(self.class_name, config.objc_prefix))

        output_header.write(_OBJC_BR)
        output_header.write('///-----------------------------------------\n')
        output_header.write('/// @name Lifecycle\n')
        output_header.write('///-----------------------------------------\n')
        output_header.write('\n')

        output_header.write('+ (instancetype)defaultManager;')
        output_header.write(_OBJC_BR)
        output_header.write('///-----------------------------------------\n')
        output_header.write('/// @name HTTP\n')
        output_header.write('///-----------------------------------------\n')
        output_header.write('\n')

        output_header.write(objc_manager.generate_web_api_declarations(config))

        output_header.write('///-----------------------------------------\n')
        output_header.write('/// @name Persistent store\n')
        output_header.write('///-----------------------------------------\n')
        output_header.write('\n')

        output_header.write(objc_manager.generate_fetch_declarations(config))
        output_header.write('@end\nNS_ASSUME_NONNULL_END\n')
    def generate_implementation(self):
        file_name = 'LCC{0}.mm'.format(self.class_name)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(
            self.group_name) + '/' + file_name
        output_impl = open(file_path, 'w')

        output_impl.write(
            '#if !defined(__has_feature) || !__has_feature(objc_arc)\n#error "This file requires ARC support."\n#endif'
        )
        output_impl.write(_OBJC_BR)
        output_impl.write(
            '#import "LCC{0}.h"\n#import "LCC{0}_CoreAddition.h"\n\n#import "LCCObjcAdapter.h"'
            .format(self.class_name))
        output_impl.write(_OBJC_BR)
        output_impl.write('@implementation LCC{0}'.format(self.class_name))
        output_impl.write(_OBJC_BR)
        output_impl.write('#pragma mark - Property')
        output_impl.write(_OBJC_BR)

        for objc_var in self.objc_var_list:
            output_impl.write(objc_var.getter_impl())
            output_impl.write(_OBJC_BR)
            output_impl.write(objc_var.setter_impl())
            output_impl.write(_OBJC_BR)

        output_impl.write('#pragma mark - Core Addition')
        output_impl.write(_OBJC_BR)
        output_impl.write(
            '+ (instancetype){0}WithCore{1}:(const lesschat::{1}&)core{1} {{\n'
            .format(string_utils.first_char_to_lower(self.class_name),
                    self.class_name))
        output_impl.write(_OBJC_SPACE)
        output_impl.write('LCC{0} *{1} = [[LCC{0} alloc] init];\n'.format(
            self.class_name,
            string_utils.first_char_to_lower(self.class_name)))
        output_impl.write(_OBJC_SPACE)
        output_impl.write('{0}->_coreHandle = core{1}.Clone();\n'.format(
            string_utils.first_char_to_lower(self.class_name),
            self.class_name))
        output_impl.write(_OBJC_SPACE)
        output_impl.write('return {0};\n}}'.format(
            string_utils.first_char_to_lower(self.class_name)))
        output_impl.write(_OBJC_BR)
        output_impl.write('@end\n')
Esempio n. 9
0
    def generate_implementation(self, config):
        """Generates Objective-C++ object header file.

        Args:
            config: A <Config> object represents user-defined configs, in this method, only apple/prefix is used.
        """
        file_name = '{1}{0}.mm'.format(self.class_name, config.objc_prefix)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name
        output_impl = open(file_path, 'w')

        output_impl.write('#if !defined(__has_feature) || !__has_feature(objc_arc)\n#error "This file requires ARC support."\n#endif')
        output_impl.write(_OBJC_BR)
        output_impl.write('#import "{1}{0}.h"\n#import "{1}{0}_CoreAddition.h"\n\n#import "{1}ObjcAdapter.h"'.format(
            self.class_name, config.objc_prefix))
        output_impl.write(_OBJC_BR)
        output_impl.write('@implementation {1}{0}'.format(self.class_name, config.objc_prefix))
        output_impl.write(_OBJC_BR)
        output_impl.write('#pragma mark - Property')
        output_impl.write(_OBJC_BR)

        for objc_var in self.objc_var_list:
            output_impl.write(objc_var.getter_impl(config))
            output_impl.write(_OBJC_BR)
            output_impl.write(objc_var.setter_impl(config))
            output_impl.write(_OBJC_BR)

        output_impl.write('#pragma mark - Core Addition')
        output_impl.write(_OBJC_BR)
        output_impl.write('+ (instancetype){0}WithCore{1}:(const {2}::{1}&)core{1} {{\n'
                          .format(string_utils.first_char_to_lower(self.class_name),
                                  self.class_name, config.cpp_namespace))
        output_impl.write(_OBJC_SPACE)
        output_impl.write('{2}{0} *{1} = [[{2}{0} alloc] init];\n'
                          .format(self.class_name,
                                  string_utils.first_char_to_lower(self.class_name),
                                  config.objc_prefix))
        output_impl.write(_OBJC_SPACE)
        output_impl.write('{0}->_coreHandle = core{1}.Clone();\n'
                          .format(string_utils.first_char_to_lower(self.class_name), self.class_name))
        output_impl.write(_OBJC_SPACE)
        output_impl.write('return {0};\n}}'.format(string_utils.first_char_to_lower(self.class_name)))
        output_impl.write(_OBJC_BR)
        output_impl.write('@end\n')
Esempio n. 10
0
    def generate_manager_core_addition_header(self, config):
        """Generates Objective-C++ object manager private header file.

        Args:
            config: A <Config> object represents user-defined configs, in this method, only apple/prefix is used.
        """
        file_name = '{1}{0}Manager_CoreAddition.h'.format(self.class_name, config.objc_prefix)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name
        output_header = open(file_path, 'w')

        output_header.write('#include "{0}_manager.h"\n#include "director.h"'.format(
            string_utils.cpp_class_name_to_cpp_file_name(self.class_name)))
        output_header.write(_OBJC_BR)
        output_header.write('@interface {1}{0}Manager () {{\n @private\n'.format(self.class_name, config.objc_prefix))
        output_header.write(_OBJC_SPACE)
        output_header.write('const {1}::{0}Manager *_coreManagerHandler;\n'.format(self.class_name, config.cpp_namespace))
        output_header.write('}')
        output_header.write(_OBJC_BR)
        output_header.write('@end\n')
    def generate_manager_implementation(self):
        if self.objc_manager_or_none is None:
            return

        objc_manager = self.objc_manager_or_none

        file_name = 'LCC{0}Manager.mm'.format(self.class_name)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(
            self.group_name) + '/' + file_name
        output_impl = open(file_path, 'w')

        output_impl.write(
            '#if !defined(__has_feature) || !__has_feature(objc_arc)\n#error "This file requires ARC support."\n#endif'
        )
        output_impl.write(_OBJC_BR)
        output_impl.write(
            '#import "LCC{0}Manager.h"\n#import "LCC{0}Manager_CoreAddition.h"\n\n'
            .format(self.class_name))
        output_impl.write(
            '#import "LCCDirector.h"\n#import "LCCObjcAdapter.h"\n#import "LCCUtils.h"\n\n'
        )
        output_impl.write(
            '#import "LCC{0}.h"\n#import "LCC{0}_CoreAddition.h"'.format(
                self.class_name))
        output_impl.write(_OBJC_BR)
        output_impl.write('@implementation LCC{0}Manager'.format(
            self.class_name))
        output_impl.write(_OBJC_BR)
        output_impl.write('#pragma mark - Lifecycle')
        output_impl.write(_OBJC_BR)
        output_impl.write(objc_manager.generate_constructor_implementation())
        output_impl.write(_OBJC_BR)
        output_impl.write(
            objc_manager.generate_default_manager_implementation())
        output_impl.write(_OBJC_BR)
        output_impl.write('#pragma mark - HTTP')
        output_impl.write(_OBJC_BR)
        output_impl.write(objc_manager.generate_web_api_implementations())
        output_impl.write('#pragma mark - Persistent store')
        output_impl.write(_OBJC_BR)
        output_impl.write(objc_manager.generate_fetch_implementations())
        output_impl.write('@end\n')
    def generate_manager_header(self):
        if self.objc_manager_or_none is None:
            return

        objc_manager = self.objc_manager_or_none

        file_name = 'LCC{0}Manager.h'.format(self.class_name)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(
            self.group_name) + '/' + file_name
        output_header = open(file_path, 'w')

        output_header.write('#import <Foundation/Foundation.h>')
        output_header.write(_OBJC_BR)
        output_header.write('@class LCC{0};'.format(self.class_name))
        output_header.write(_OBJC_BR)

        output_header.write('NS_ASSUME_NONNULL_BEGIN\n')
        output_header.write('@interface LCC{0}Manager : NSObject'.format(
            self.class_name))

        output_header.write(_OBJC_BR)
        output_header.write('///-----------------------------------------\n')
        output_header.write('/// @name Lifecycle\n')
        output_header.write('///-----------------------------------------\n')
        output_header.write('\n')

        output_header.write('+ (instancetype)defaultManager;')
        output_header.write(_OBJC_BR)
        output_header.write('///-----------------------------------------\n')
        output_header.write('/// @name HTTP\n')
        output_header.write('///-----------------------------------------\n')
        output_header.write('\n')

        output_header.write(objc_manager.generate_web_api_declarations())

        output_header.write('///-----------------------------------------\n')
        output_header.write('/// @name Persistent store\n')
        output_header.write('///-----------------------------------------\n')
        output_header.write('\n')

        output_header.write(objc_manager.generate_fetch_declarations())
        output_header.write('@end\nNS_ASSUME_NONNULL_END\n')
    def generate_manager_core_addition_header(self):
        file_name = 'LCC{0}Manager_CoreAddition.h'.format(self.class_name)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(
            self.group_name) + '/' + file_name
        output_header = open(file_path, 'w')

        output_header.write(
            '#include "{0}_manager.h"\n#include "director.h"'.format(
                string_utils.cpp_class_name_to_cpp_file_name(self.class_name)))
        output_header.write(_OBJC_BR)
        output_header.write(
            '@interface LCC{0}Manager () {{\n@private\n'.format(
                self.class_name))
        output_header.write(_OBJC_SPACE)
        output_header.write(
            'const lesschat::{0}Manager *_coreManagerHandler;\n'.format(
                self.class_name))
        output_header.write('}')
        output_header.write(_OBJC_BR)
        output_header.write('@end\n')
    def generate_core_addition_header(self):
        file_name = 'LCC{0}_CoreAddition.h'.format(self.class_name)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name
        output_header = open(file_path, 'w')

        output_header.write('#include "{0}.h"'.format(CppClass.convert_class_name_to_file_name(self.class_name)))
        output_header.write(_OBJC_BR)
        output_header.write('@interface LCC{0} () {{'.format(self.class_name))
        output_header.write('\n')
        output_header.write('@package')
        output_header.write('\n')
        output_header.write(_OBJC_SPACE)
        output_header.write('std::unique_ptr<lesschat::{0}> _coreHandle;'.format(self.class_name))
        output_header.write('\n')
        output_header.write('}')
        output_header.write(_OBJC_BR)
        output_header.write('+ (instancetype){0}WithCore{1}:(const lesschat::{1}&)core{1};'
                            .format(string_utils.first_char_to_lower(self.class_name), self.class_name))
        output_header.write(_OBJC_BR)
        output_header.write('@end')
    def generate_header(self):
        file_name = 'LCC{0}.h'.format(self.class_name)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name
        output_header = open(file_path, 'w')

        output_header.write('#import <Foundation/Foundation.h>')
        output_header.write(_OBJC_BR)

        for objc_enum in self.objc_enum_list:
            output_header.write(objc_enum.generate_objc_enum(self.class_name))
            output_header.write(_OBJC_BR)

        output_header.write('NS_ASSUME_NONNULL_BEGIN\n@interface LCC{0} : NSObject'.format(self.class_name))
        output_header.write(_OBJC_BR)

        for objc_var in self.objc_var_list:
            output_header.write(objc_var.property())
            output_header.write(_OBJC_BR)

        output_header.write('@end\nNS_ASSUME_NONNULL_END')
        output_header.write(_OBJC_BR)
    def generate_manager_header(self):
        if self.objc_manager_or_none is None:
            return

        objc_manager = self.objc_manager_or_none

        file_name = 'LCC{0}Manager.h'.format(self.class_name)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name
        output_header = open(file_path, 'w')

        output_header.write('#import <Foundation/Foundation.h>')
        output_header.write(_OBJC_BR)
        output_header.write('@class LCC{0};'.format(self.class_name))
        output_header.write(_OBJC_BR)

        output_header.write('NS_ASSUME_NONNULL_BEGIN\n')
        output_header.write('@interface LCC{0}Manager : NSObject'.format(self.class_name))

        output_header.write(_OBJC_BR)
        output_header.write('///-----------------------------------------\n')
        output_header.write('/// @name Lifecycle\n')
        output_header.write('///-----------------------------------------\n')
        output_header.write('\n')

        output_header.write('+ (instancetype)defaultManager;')
        output_header.write(_OBJC_BR)
        output_header.write('///-----------------------------------------\n')
        output_header.write('/// @name HTTP\n')
        output_header.write('///-----------------------------------------\n')
        output_header.write('\n')

        output_header.write(objc_manager.generate_web_api_declarations())

        output_header.write('///-----------------------------------------\n')
        output_header.write('/// @name Persistent store\n')
        output_header.write('///-----------------------------------------\n')
        output_header.write('\n')

        output_header.write(objc_manager.generate_fetch_declarations())
        output_header.write('@end\nNS_ASSUME_NONNULL_END\n')
Esempio n. 17
0
    def generate_manager_implementation(self, config):
        """Generates Objective-C++ object manager implementation file.

        Args:
            config: A <Config> object represents user-defined configs, in this method, only apple/prefix is used.
        """
        if self.objc_manager_or_none is None:
            return

        objc_manager = self.objc_manager_or_none

        file_name = '{1}{0}Manager.mm'.format(self.class_name, config.objc_prefix)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name
        output_impl = open(file_path, 'w')

        output_impl.write('#if !defined(__has_feature) || !__has_feature(objc_arc)\n#error "This file requires ARC support."\n#endif')
        output_impl.write(_OBJC_BR)
        output_impl.write('#import "{1}{0}Manager.h"\n#import "{1}{0}Manager_CoreAddition.h"\n\n'
                          .format(self.class_name, config.objc_prefix))
        output_impl.write('#import "{0}Director.h"\n#import "{0}ObjcAdapter.h"\n#import "{0}Utils.h"\n\n'
                          .format(config.objc_prefix))
        output_impl.write('#import "{1}{0}.h"\n#import "{1}{0}_CoreAddition.h"'.format(self.class_name,
                                                                                       config.objc_prefix))
        output_impl.write(_OBJC_BR)
        output_impl.write('@implementation {1}{0}Manager'.format(self.class_name, config.objc_prefix))
        output_impl.write(_OBJC_BR)
        output_impl.write('#pragma mark - Lifecycle')
        output_impl.write(_OBJC_BR)
        output_impl.write(objc_manager.generate_constructor_implementation(config))
        output_impl.write(_OBJC_BR)
        output_impl.write(objc_manager.generate_default_manager_implementation(config))
        output_impl.write(_OBJC_BR)
        output_impl.write('#pragma mark - HTTP')
        output_impl.write(_OBJC_BR)
        output_impl.write(objc_manager.generate_web_api_implementations(config))
        output_impl.write('#pragma mark - Persistent store')
        output_impl.write(_OBJC_BR)
        output_impl.write(objc_manager.generate_fetch_implementations(config))
        output_impl.write('@end\n')
    def generate_header(self):
        file_name = 'LCC{0}.h'.format(self.class_name)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(
            self.group_name) + '/' + file_name
        output_header = open(file_path, 'w')

        output_header.write('#import <Foundation/Foundation.h>')
        output_header.write(_OBJC_BR)

        for objc_enum in self.objc_enum_list:
            output_header.write(objc_enum.generate_objc_enum(self.class_name))
            output_header.write(_OBJC_BR)

        output_header.write(
            'NS_ASSUME_NONNULL_BEGIN\n@interface LCC{0} : NSObject'.format(
                self.class_name))
        output_header.write(_OBJC_BR)

        for objc_var in self.objc_var_list:
            output_header.write(objc_var.property())
            output_header.write(_OBJC_BR)

        output_header.write('@end\nNS_ASSUME_NONNULL_END')
        output_header.write(_OBJC_BR)
    def parse(self, directory, config):
        """Parse the input file with user-defined config.

        Args:
            directory: A string represents module.xml file.
            config: A <Config> object represents user-defined info, such as class prefix.
        """
        # create core folder if not exists and remove last build
        objc_dir_path = 'build/ObjectiveCppWrapper'
        io_utils.make_directory_if_not_exists(objc_dir_path)

        # start parsing xml
        e = xml.etree.ElementTree.parse(directory)
        root = e.getroot()

        # search directories
        for folder_node in root.findall('group'):
            group_name = folder_node.get('name')
            objc_group_name = 'build/ObjectiveCppWrapper/' + string_utils.cpp_group_name_to_objc_group_name(
                group_name)
            io_utils.make_directory_if_not_exists(objc_group_name)

            # search classes
            for class_node in folder_node.findall('class'):
                class_name = class_node.get('name')

                print 'Find objc class {0} under "{1}" group'.format(
                    class_name, group_name)

                # parse all <enum/>
                objc_enum_list = []
                for enum in class_node.findall('enum'):
                    enum_name = enum.get('name')
                    objc_enum = ObjcEnum(enum_name)
                    for enum_value in enum.findall('value'):
                        int_value = enum_value.get('int_value')
                        alias = enum_value.get('alias')
                        objc_enum.append(int_value, alias)
                    objc_enum_list.append(objc_enum)

                # parse all <variable/>
                objc_var_list = []
                for variable in class_node.findall('variable'):
                    variable_name = variable.get('name')
                    variable_type = variable.get('type')
                    variable_enum_or_none = variable.get('enum')

                    objc_var = ObjcVariable(variable_name, variable_type)
                    objc_var.set_enum_class_name(variable_enum_or_none)
                    objc_var_list.append(objc_var)

                # parse <manager/>
                objc_manager = None
                manager_or_none = class_node.find('manager')
                if manager_or_none is not None:
                    manager_name = manager_or_none.get('name')
                    objc_manager = ObjcManager(manager_name)

                    # parse all <save/>
                    for save_node in manager_or_none.findall('save'):
                        is_plural = False
                        plural_node = save_node.get('plural')
                        if plural_node is not None:
                            is_plural = True
                        alias_attr = save_node.get('alias')
                        save_command = CppManagerSaveCommand(
                            is_plural, [], alias_attr)
                        objc_manager.add_save_command(save_command)

                    # parse all <delete/>
                    for delete_node in manager_or_none.findall('delete'):
                        is_plural = False
                        plural_node = delete_node.get('plural')
                        if plural_node is not None:
                            is_plural = True

                        by = delete_node.get('by')
                        alias_attr = delete_node.get('alias')
                        delete_command = CppManagerDeleteCommand(
                            is_plural, by, [], alias_attr)
                        objc_manager.add_delete_command(delete_command)

                    # parse all <fetch/>
                    for fetch_node in manager_or_none.findall('fetch'):
                        is_plural = False
                        plural_node = fetch_node.get('plural')
                        if plural_node is not None:
                            is_plural = True

                        by = fetch_node.get('by')
                        sort_by_or_none = fetch_node.get('sort')
                        is_asc = True
                        if sort_by_or_none is not None:
                            desc_desciption_or_none = fetch_node.get('desc')
                            if desc_desciption_or_none is not None:
                                if desc_desciption_or_none == 'true':
                                    is_asc = False
                        alias_attr = fetch_node.get('alias')
                        fetch_command = CppManagerFetchCommand(
                            is_plural, by, sort_by_or_none, is_asc, [],
                            alias_attr)
                        objc_manager.add_fetch_command(fetch_command)

                    # parse all <api/>
                    for api_node in manager_or_none.findall('api'):
                        api_name = api_node.get('name')
                        api_alias = api_node.get('alias')
                        api_method = api_node.get('method')
                        api_uri = api_node.get('uri')

                        input_var_list = []
                        inputs_node = api_node.find('inputs')
                        for variable_node in inputs_node.findall('variable'):
                            var_name = variable_node.get('name')
                            var_type_string = variable_node.get('type')
                            var_enum_or_none = variable_node.get('enum')

                            var = ObjcVariable(var_name, var_type_string)
                            var.set_enum_class_name(var_enum_or_none)

                            input_var_list.append(var)

                        output_var_list = []
                        outputs_node = api_node.find('outputs')
                        for variable_node in outputs_node.findall('variable'):
                            var_name = variable_node.get('name')
                            var_type_string = variable_node.get('type')
                            var_enum_or_none = variable_node.get('enum')

                            var = ObjcVariable(var_name, var_type_string)
                            var.set_enum_class_name(var_enum_or_none)

                            output_var_list.append(var)

                        api = CppApiDescription(api_name, api_alias,
                                                api_method, api_uri,
                                                input_var_list,
                                                output_var_list, [])
                        objc_manager.add_api_description(api)

                # write objective-c++ wrapper core addition header
                objc_wrapper = ObjcClass(group_name, class_name, objc_var_list,
                                         objc_enum_list, objc_manager)
                objc_wrapper.generate_core_addition_header(config)

                # write objective-c++ wrapper header
                objc_wrapper.generate_header(config)

                # write objective-c++ wrapper implementation
                objc_wrapper.generate_implementation(config)

                # write objective-c++ wrapper manager category header
                objc_wrapper.generate_manager_core_addition_header(config)

                # write objective-c++ wrapper manager header
                objc_wrapper.generate_manager_header(config)

                # write objective-c++ wrapper manager implementation
                objc_wrapper.generate_manager_implementation(config)
    def parse(self, directory, config):
        """Parse the input file with user-defined config.

        Args:
            directory: A string represents module.xml file.
            config: A <Config> object represents user-defined info, such as class prefix.
        """
        # create core folder if not exists and remove last build
        objc_dir_path = 'build/ObjectiveCppWrapper'
        io_utils.make_directory_if_not_exists(objc_dir_path)

        # start parsing xml
        e = xml.etree.ElementTree.parse(directory)
        root = e.getroot()

        # search directories
        for folder_node in root.findall('group'):
            group_name = folder_node.get('name')
            objc_group_name = 'build/ObjectiveCppWrapper/' + string_utils.cpp_group_name_to_objc_group_name(group_name)
            io_utils.make_directory_if_not_exists(objc_group_name)

            # search classes
            for class_node in folder_node.findall('class'):
                class_name = class_node.get('name')

                print 'Find objc class {0} under "{1}" group'.format(class_name, group_name)

                # parse all <enum/>
                objc_enum_list = []
                for enum in class_node.findall('enum'):
                    enum_name = enum.get('name')
                    objc_enum = ObjcEnum(enum_name)
                    for enum_value in enum.findall('value'):
                        int_value = enum_value.get('int_value')
                        alias = enum_value.get('alias')
                        objc_enum.append(int_value, alias)
                    objc_enum_list.append(objc_enum)

                # parse all <variable/>
                objc_var_list = []
                for variable in class_node.findall('variable'):
                    variable_name = variable.get('name')
                    variable_type = variable.get('type')
                    variable_enum_or_none = variable.get('enum')

                    objc_var = ObjcVariable(variable_name, variable_type)
                    objc_var.set_enum_class_name(variable_enum_or_none)
                    objc_var_list.append(objc_var)

                # parse <manager/>
                objc_manager = None
                manager_or_none = class_node.find('manager')
                if manager_or_none is not None:
                    manager_name = manager_or_none.get('name')
                    objc_manager = ObjcManager(manager_name)

                    # parse all <save/>
                    for save_node in manager_or_none.findall('save'):
                        is_plural = False
                        plural_node = save_node.get('plural')
                        if plural_node is not None:
                            is_plural = True
                        alias_attr = save_node.get('alias')
                        save_command = CppManagerSaveCommand(is_plural, [], alias_attr)
                        objc_manager.add_save_command(save_command)

                    # parse all <delete/>
                    for delete_node in manager_or_none.findall('delete'):
                        is_plural = False
                        plural_node = delete_node.get('plural')
                        if plural_node is not None:
                            is_plural = True

                        by = delete_node.get('by')
                        alias_attr = delete_node.get('alias')
                        delete_command = CppManagerDeleteCommand(is_plural, by, [], alias_attr)
                        objc_manager.add_delete_command(delete_command)

                    # parse all <fetch/>
                    for fetch_node in manager_or_none.findall('fetch'):
                        is_plural = False
                        plural_node = fetch_node.get('plural')
                        if plural_node is not None:
                            is_plural = True

                        by = fetch_node.get('by')
                        sort_by_or_none = fetch_node.get('sort')
                        is_asc = True
                        if sort_by_or_none is not None:
                            desc_desciption_or_none = fetch_node.get('desc')
                            if desc_desciption_or_none is not None:
                                if desc_desciption_or_none == 'true':
                                    is_asc = False
                        alias_attr = fetch_node.get('alias')
                        fetch_command = CppManagerFetchCommand(is_plural, by, sort_by_or_none, is_asc, [], alias_attr)
                        objc_manager.add_fetch_command(fetch_command)

                    # parse all <api/>
                    for api_node in manager_or_none.findall('api'):                        
                        api_name = api_node.get('name')
                        api_alias = api_node.get('alias')
                        api_method = api_node.get('method')
                        api_uri = api_node.get('uri')

                        input_var_list = []
                        inputs_node = api_node.find('inputs')
                        for variable_node in inputs_node.findall('variable'):
                            var_name = variable_node.get('name')
                            var_type_string = variable_node.get('type')
                            var_enum_or_none = variable_node.get('enum')

                            var = ObjcVariable(var_name, var_type_string)
                            var.set_enum_class_name(var_enum_or_none)

                            input_var_list.append(var)

                        output_var_list = []
                        outputs_node = api_node.find('outputs')
                        for variable_node in outputs_node.findall('variable'):
                            var_name = variable_node.get('name')
                            var_type_string = variable_node.get('type')
                            var_enum_or_none = variable_node.get('enum')

                            var = ObjcVariable(var_name, var_type_string)
                            var.set_enum_class_name(var_enum_or_none)

                            output_var_list.append(var)

                        api = CppApiDescription(api_name, api_alias, api_method, api_uri, input_var_list,
                                                output_var_list, [])
                        objc_manager.add_api_description(api)

                # write objective-c++ wrapper core addition header
                objc_wrapper = ObjcClass(group_name, class_name, objc_var_list, objc_enum_list, objc_manager)
                objc_wrapper.generate_core_addition_header(config)

                # write objective-c++ wrapper header
                objc_wrapper.generate_header(config)

                # write objective-c++ wrapper implementation
                objc_wrapper.generate_implementation(config)

                # write objective-c++ wrapper manager category header
                objc_wrapper.generate_manager_core_addition_header(config)

                # write objective-c++ wrapper manager header
                objc_wrapper.generate_manager_header(config)

                # write objective-c++ wrapper manager implementation
                objc_wrapper.generate_manager_implementation(config)