require_relative '../base' module Analytics module Serializer class ObjC < Base # It's named AnalyticsFile instead of Analytics, # because it failed to have a class which used the same name as the parent module. class AnalyticsFile def initialize(src) @src = src end def save(path) @class_name = 'Analytics' @file_name = @class_name + '.h' output_path = File.join(path, @file_name) File.write(output_path, render_h) @file_name = @class_name + '.m' output_path = File.join(path, @file_name) File.write(output_path, render_m) end private def render_h ERB.new(template_h, nil, '-').result(binding) end def template_h <<~TEMPLATE <%= ERB.new(Analytics::Templates.tmpl_at('header.erb')).result(binding) %> #import #import "AnalyticsLogger.h" #import "AnalyticsEvent.h" #import "AnalyticsScreen.h" #import "AnalyticsUserProperty.h" NS_ASSUME_NONNULL_BEGIN __swift_unavailable("This class is only available in ObjC.") @interface Analytics : NSObject - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; - (instancetype)initWithLoggers:(NSArray> *)loggers; + (instancetype)analyticsWithLoggers:(NSArray> *)loggers; @end NS_ASSUME_NONNULL_END TEMPLATE end def render_m ERB.new(template_m, nil, '-').result(binding) end def template_m <<~TEMPLATE <%= ERB.new(Analytics::Templates.tmpl_at('header.erb')).result(binding) %> #import "<%= @class_name + '.h' %>" @interface Analytics () @property (nonatomic, strong, readonly) NSArray> *loggers; @end @implementation Analytics - (instancetype)initWithLoggers:(NSArray> *)loggers { if (self = [super init]) { _loggers = loggers; } return self; } + (instancetype)analyticsWithLoggers:(NSArray> *)loggers { return [[self alloc] initWithLoggers:loggers]; } #pragma mark - AnalyticsLogger - (void)setEnabled:(BOOL)enabled { for (id logger in self.loggers) { [logger setEnabled:enabled]; } } - (void)logEvent:(AnalyticsEvent *)event { for (id logger in self.loggers) { [logger logEvent:event]; } } - (void)trackScreen:(AnalyticsScreen *)screen { for (id logger in self.loggers) { [logger trackScreen:screen]; } } - (void)setUserProperty:(AnalyticsUserProperty *)userProperty { for (id logger in self.loggers) { [logger setUserProperty:userProperty]; } } @end TEMPLATE end end end end end