From 1ec45b652a2aef904fac5477a3579d62c7545097 Mon Sep 17 00:00:00 2001 From: "v.barabanov" Date: Wed, 24 Sep 2025 22:20:58 +0300 Subject: [PATCH] Add support for specific external analytics tracker protocols in Stencil - Introduced ability to specify protocol based on the external tracker defined in the YAML schema - Added mapping for AppsFlyerEvent, AppMetricaEvent and default AllExternalAnalyticsEvent - Updated Stencil templates to use the resolved protocol dynamically instead of a hardcoded default --- .../Event/DefaultEventGenerator.swift | 15 ++++++++++++ .../Event/ExternalEventContext.swift | 1 + .../Models/Event/External/ExternalEvent.swift | 1 + .../Event/External/ExternalEventTracker.swift | 23 +++++++++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 Sources/AnalyticsGen/Models/Event/External/ExternalEventTracker.swift diff --git a/Sources/AnalyticsGen/Generators/Event/DefaultEventGenerator.swift b/Sources/AnalyticsGen/Generators/Event/DefaultEventGenerator.swift index a12a1e1..af9a099 100644 --- a/Sources/AnalyticsGen/Generators/Event/DefaultEventGenerator.swift +++ b/Sources/AnalyticsGen/Generators/Event/DefaultEventGenerator.swift @@ -80,6 +80,20 @@ final class DefaultEventGenerator: EventGenerator { return parameters } + private func resolveEventProtocol(event: ExternalEvent) -> String { + let protocolName: String + switch event.tracker { + case .appsFlyer: + protocolName = "AppsFlyerEvent" + case .appMetrica: + protocolName = "AppMetricaEvent" + case .none: + protocolName = "AllExternalAnalyticsEvent" + } + + return protocolName + } + private func generate( parameters: GenerationParameters, event: Event, @@ -165,6 +179,7 @@ final class DefaultEventGenerator: EventGenerator { oneOf: label.oneOf ) }, + eventProtocol: resolveEventProtocol(event: externalEvent), initialisationParameters: resolveExternalEventInitialisationParameters(event: externalEvent) ) ) diff --git a/Sources/AnalyticsGen/Generators/Event/ExternalEventContext.swift b/Sources/AnalyticsGen/Generators/Event/ExternalEventContext.swift index 366233c..be4bbbd 100644 --- a/Sources/AnalyticsGen/Generators/Event/ExternalEventContext.swift +++ b/Sources/AnalyticsGen/Generators/Event/ExternalEventContext.swift @@ -53,5 +53,6 @@ struct ExternalEventContext: Encodable { let schemePath: String let action: Action let label: Label? + let eventProtocol: String let initialisationParameters: [Parameter] } diff --git a/Sources/AnalyticsGen/Models/Event/External/ExternalEvent.swift b/Sources/AnalyticsGen/Models/Event/External/ExternalEvent.swift index 2c85045..ffacdab 100644 --- a/Sources/AnalyticsGen/Models/Event/External/ExternalEvent.swift +++ b/Sources/AnalyticsGen/Models/Event/External/ExternalEvent.swift @@ -9,4 +9,5 @@ struct ExternalEvent: Decodable { let forContractor: Bool? let label: ExternalEventLabel? let platform: EventPlatform? + let tracker: ExternalEventTracker? } diff --git a/Sources/AnalyticsGen/Models/Event/External/ExternalEventTracker.swift b/Sources/AnalyticsGen/Models/Event/External/ExternalEventTracker.swift new file mode 100644 index 0000000..5306c18 --- /dev/null +++ b/Sources/AnalyticsGen/Models/Event/External/ExternalEventTracker.swift @@ -0,0 +1,23 @@ +import Foundation + +enum ExternalEventTracker: Decodable { + case appsFlyer + case appMetrica + + init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + let rawValue = try container.decode(String.self).lowercased() + + switch rawValue { + case "appsflyer": + self = .appsFlyer + case "appmetrica": + self = .appMetrica + default: + throw DecodingError.dataCorruptedError( + in: container, + debugDescription: "Unknown tracker value: \(rawValue)" + ) + } + } +}