Add parameter defaultValue and value and add replaceIn parameter in another parameter
Some checks failed
gitea-openium/resgen.swift/pipeline/pr-master There was a failure building this commit
Some checks failed
gitea-openium/resgen.swift/pipeline/pr-master There was a failure building this commit
This commit is contained in:
parent
ab91c1c277
commit
922ed56959
@ -5,7 +5,11 @@ import FirebaseAnalytics
|
||||
// MARK: - Protocol
|
||||
|
||||
protocol AnalyticsManagerProtocol {
|
||||
func logScreen(name: String, path: String)
|
||||
func logScreen(
|
||||
name: String,
|
||||
path: String,
|
||||
params: [String: Any]?
|
||||
)
|
||||
func logEvent(
|
||||
name: String,
|
||||
action: String,
|
||||
@ -17,11 +21,27 @@ protocol AnalyticsManagerProtocol {
|
||||
// MARK: - Firebase
|
||||
|
||||
class FirebaseAnalyticsManager: AnalyticsManagerProtocol {
|
||||
func logScreen(name: String, path: String) {
|
||||
func logScreen(
|
||||
name: String,
|
||||
path: String,
|
||||
params: [String: Any]?
|
||||
) {
|
||||
let parameters = [
|
||||
AnalyticsParameterScreenName: name as NSObject
|
||||
]
|
||||
|
||||
if let supplementaryParameters = params {
|
||||
for (newKey, newValue) in supplementaryParameters {
|
||||
if parameters.contains(where: { (key: String, value: NSObject) in
|
||||
key == newKey
|
||||
}) {
|
||||
continue
|
||||
}
|
||||
|
||||
parameters[newKey] = newValue as? NSObject
|
||||
}
|
||||
}
|
||||
|
||||
Analytics.logEvent(
|
||||
AnalyticsEventScreenView,
|
||||
parameters: parameters
|
||||
@ -80,11 +100,19 @@ class AnalyticsManager {
|
||||
managers.append(FirebaseAnalyticsManager())
|
||||
}
|
||||
|
||||
private func logScreen(name: String, path: String) {
|
||||
private func logScreen(
|
||||
name: String,
|
||||
path: String,
|
||||
params: [String: Any]?
|
||||
) {
|
||||
guard isEnabled else { return }
|
||||
|
||||
managers.forEach { manager in
|
||||
manager.logScreen(name: name, path: path)
|
||||
manager.logScreen(
|
||||
name: name,
|
||||
path: path,
|
||||
params: params
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@ -108,31 +136,39 @@ class AnalyticsManager {
|
||||
|
||||
// MARK: - section_one
|
||||
|
||||
func logScreenS1DefOne(title: String) {
|
||||
logScreen(
|
||||
static func logScreenS1DefOne(title: String, test2: String = "test") {
|
||||
AnalyticsManager.shared.logScreen(
|
||||
name: "s1 def one \(title)",
|
||||
path: ""
|
||||
path: "",
|
||||
params: ["test2": test2]
|
||||
)
|
||||
}
|
||||
|
||||
func logEventS1DefTwo(title: String, count: String) {
|
||||
logEvent(
|
||||
static func logEventS1DefTwo(
|
||||
title: String,
|
||||
count: String,
|
||||
test2: String = "test"
|
||||
) {
|
||||
AnalyticsManager.shared.logEvent(
|
||||
name: "s1 def two",
|
||||
action: "test",
|
||||
category: "test",
|
||||
params: [
|
||||
"title": title,
|
||||
"count": count
|
||||
"count": count,
|
||||
"test": "test",
|
||||
"test2": test2
|
||||
]
|
||||
)
|
||||
}
|
||||
|
||||
// MARK: - section_two
|
||||
|
||||
func logScreenS2DefOne() {
|
||||
logScreen(
|
||||
static func logScreenS2DefOne() {
|
||||
AnalyticsManager.shared.logScreen(
|
||||
name: "s2 def one",
|
||||
path: ""
|
||||
path: "",
|
||||
params: nil
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -10,6 +10,13 @@ categories:
|
||||
- name: title
|
||||
type: String
|
||||
replaceIn: name,path
|
||||
- name: test
|
||||
type: String
|
||||
value: test
|
||||
replaceIn: name,path
|
||||
- name: test2
|
||||
type: String
|
||||
defaultValue: test
|
||||
|
||||
events:
|
||||
- id: s1_def_two
|
||||
@ -22,6 +29,12 @@ categories:
|
||||
type: String
|
||||
- name: count
|
||||
type: String
|
||||
- name: test
|
||||
type: String
|
||||
value: test
|
||||
- name: test2
|
||||
type: String
|
||||
defaultValue: test
|
||||
|
||||
- id: section_two
|
||||
screens:
|
||||
|
@ -103,11 +103,19 @@ class AnalyticsGenerator {
|
||||
|
||||
private static func getPrivateLogFunction() -> String {
|
||||
"""
|
||||
private func logScreen(name: String, path: String) {
|
||||
private func logScreen(
|
||||
name: String,
|
||||
path: String,
|
||||
params: [String: Any]?
|
||||
) {
|
||||
guard isEnabled else { return }
|
||||
|
||||
managers.forEach { manager in
|
||||
manager.logScreen(name: name, path: path)
|
||||
manager.logScreen(
|
||||
name: name,
|
||||
path: path,
|
||||
params: params
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@ -169,7 +177,11 @@ class AnalyticsGenerator {
|
||||
// MARK: - Protocol
|
||||
|
||||
protocol AnalyticsManagerProtocol {
|
||||
func logScreen(name: String, path: String)
|
||||
func logScreen(
|
||||
name: String,
|
||||
path: String,
|
||||
params: [String: Any]?
|
||||
)
|
||||
func logEvent(
|
||||
name: String,
|
||||
action: String,
|
||||
|
@ -31,11 +31,31 @@ enum FirebaseGenerator {
|
||||
|
||||
private static var logScreen: String {
|
||||
"""
|
||||
func logScreen(name: String, path: String) {
|
||||
let parameters = [
|
||||
func logScreen(
|
||||
name: String,
|
||||
path: String,
|
||||
params: [String: Any]?
|
||||
) {
|
||||
var parameters = [
|
||||
AnalyticsParameterScreenName: name as NSObject
|
||||
]
|
||||
|
||||
if path.isEmpty == false {
|
||||
parameters["path"] = path + "/iOS" as NSObject
|
||||
}
|
||||
|
||||
if let supplementaryParameters = params {
|
||||
for (newKey, newValue) in supplementaryParameters {
|
||||
if parameters.contains(where: { (key: String, value: NSObject) in
|
||||
key == newKey
|
||||
}) {
|
||||
continue
|
||||
}
|
||||
|
||||
parameters[newKey] = newValue as? NSObject
|
||||
}
|
||||
}
|
||||
|
||||
Analytics.logEvent(
|
||||
AnalyticsEventScreenView,
|
||||
parameters: parameters
|
||||
@ -54,11 +74,17 @@ enum FirebaseGenerator {
|
||||
params: [String: Any]?
|
||||
) {
|
||||
var parameters: [String:NSObject] = [
|
||||
AnalyticsParameterItemName: name.replacingOccurrences(of: " ", with: "_") as NSObject,
|
||||
AnalyticsParameterItemCategory: category as NSObject,
|
||||
"action": action as NSObject,
|
||||
AnalyticsParameterItemName: name.replacingOccurrences(of: " ", with: "_") as NSObject
|
||||
]
|
||||
|
||||
if category.isEmpty == false {
|
||||
parameters["AnalyticsParameterItemCategory"] = category as NSObject
|
||||
}
|
||||
|
||||
if action.isEmpty == false {
|
||||
parameters["action"] = action as NSObject
|
||||
}
|
||||
|
||||
if let supplementaryParameters = params {
|
||||
for (newKey, newValue) in supplementaryParameters {
|
||||
if parameters.contains(where: { (key: String, value: NSObject) in
|
||||
|
@ -66,7 +66,11 @@ enum MatomoGenerator {
|
||||
|
||||
private static var logScreen: String {
|
||||
"""
|
||||
func logScreen(name: String, path: String) {
|
||||
func logScreen(
|
||||
name: String,
|
||||
path: String,
|
||||
params: [String: Any]?
|
||||
) {
|
||||
guard !tracker.isOptedOut else { return }
|
||||
guard let trackerUrl = tracker.contentBase?.absoluteString else { return }
|
||||
|
||||
|
@ -51,14 +51,21 @@ class AnalyticsDefinition {
|
||||
var params = parameters
|
||||
var result: String
|
||||
|
||||
if type == .screen {
|
||||
params = params.filter { param in
|
||||
!param.replaceIn.isEmpty
|
||||
}
|
||||
let paramsString = params.compactMap { parameter -> String? in
|
||||
guard parameter.value.isEmpty else { return nil }
|
||||
|
||||
let defaultValue: String
|
||||
switch parameter.type {
|
||||
case .bool:
|
||||
defaultValue = "\(parameter.defaultValue.lowercased())"
|
||||
case .int, .double:
|
||||
defaultValue = "\(parameter.defaultValue)"
|
||||
case .string:
|
||||
defaultValue = "\"\(parameter.defaultValue)\""
|
||||
}
|
||||
|
||||
let paramsString = params.map { parameter in
|
||||
"\(parameter.name): \(parameter.type)"
|
||||
let defaultValueString = parameter.defaultValue.isEmpty ? "" : " = \(defaultValue)"
|
||||
return "\(parameter.name): \(parameter.type.rawValue)\(defaultValueString)"
|
||||
}
|
||||
|
||||
if paramsString.count > 2 {
|
||||
@ -84,7 +91,10 @@ class AnalyticsDefinition {
|
||||
case "path": path = path.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))")
|
||||
case "category": category = category.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))")
|
||||
case "action": action = action.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))")
|
||||
default: break
|
||||
default:
|
||||
if let param = parameters.first(where: { $0.name == rep }), param.value.isEmpty == false {
|
||||
param.value = param.value.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -99,7 +109,18 @@ class AnalyticsDefinition {
|
||||
}
|
||||
|
||||
supplementaryParams.forEach { param in
|
||||
if param.value.isEmpty {
|
||||
params.append("\"\(param.name)\": \(param.name)")
|
||||
} else {
|
||||
switch param.type {
|
||||
case .bool:
|
||||
params.append("\"\(param.name)\": \(param.value.lowercased())")
|
||||
case .int, .double:
|
||||
params.append("\"\(param.name)\": \(param.value)")
|
||||
case .string:
|
||||
params.append("\"\(param.name)\": \"\(param.value)\"")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if params.count > 1 {
|
||||
@ -113,14 +134,15 @@ class AnalyticsDefinition {
|
||||
[\(params.joined(separator: ", "))]
|
||||
"""
|
||||
} else {
|
||||
result = "[:]"
|
||||
result = "nil"
|
||||
}
|
||||
|
||||
if type == .screen {
|
||||
return """
|
||||
logScreen(
|
||||
name: "\(name)",
|
||||
path: "\(path)"
|
||||
path: "\(path)",
|
||||
params: \(result)
|
||||
)
|
||||
"""
|
||||
} else {
|
||||
|
@ -41,5 +41,7 @@ struct AnalyticsDefinitionEventDTO: Codable {
|
||||
struct AnalyticsParameterDTO: Codable {
|
||||
var name: String
|
||||
var type: String
|
||||
var value: String?
|
||||
var defaultValue: String?
|
||||
var replaceIn: String?
|
||||
}
|
||||
|
@ -9,13 +9,17 @@ import Foundation
|
||||
|
||||
class AnalyticsParameter {
|
||||
var name: String
|
||||
var type: String
|
||||
var type: ParameterType
|
||||
var value: String
|
||||
var defaultValue: String
|
||||
var replaceIn: [String] = []
|
||||
|
||||
// MARK: - Init
|
||||
|
||||
init(name: String, type: String) {
|
||||
init(name: String, type: ParameterType, value: String, defaultValue: String) {
|
||||
self.name = name
|
||||
self.type = type
|
||||
self.value = value
|
||||
self.defaultValue = defaultValue
|
||||
}
|
||||
}
|
||||
|
15
Sources/ResgenSwift/Analytics/Model/ParameterType.swift
Normal file
15
Sources/ResgenSwift/Analytics/Model/ParameterType.swift
Normal file
@ -0,0 +1,15 @@
|
||||
//
|
||||
// File.swift
|
||||
//
|
||||
//
|
||||
// Created by Loris Perret on 17/07/2024.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
enum ParameterType: String {
|
||||
case string = "String"
|
||||
case int = "Int"
|
||||
case double = "Double"
|
||||
case bool = "Bool"
|
||||
}
|
@ -30,25 +30,52 @@ class AnalyticsFileParser {
|
||||
}
|
||||
|
||||
private static func getParameters(from parameters: [AnalyticsParameterDTO]) -> [AnalyticsParameter] {
|
||||
parameters.map { dtoParameter in
|
||||
func verify(value: String?, for type: ParameterType) {
|
||||
guard let value, value.isEmpty == false else { return }
|
||||
|
||||
switch type {
|
||||
case .int:
|
||||
if Int(value) == nil {
|
||||
let error = AnalyticsError.invalidParameter("type of \(value) is not \(type)")
|
||||
print(error.description)
|
||||
Analytics.exit(withError: error)
|
||||
}
|
||||
case .bool:
|
||||
if Bool(value.lowercased()) == nil {
|
||||
let error = AnalyticsError.invalidParameter("type of \(value) is not \(type)")
|
||||
print(error.description)
|
||||
Analytics.exit(withError: error)
|
||||
}
|
||||
case .double:
|
||||
if Double(value) == nil {
|
||||
let error = AnalyticsError.invalidParameter("type of \(value) is not \(type)")
|
||||
print(error.description)
|
||||
Analytics.exit(withError: error)
|
||||
}
|
||||
case .string:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return parameters.map { dtoParameter in
|
||||
// Type
|
||||
|
||||
let type = dtoParameter.type.uppercasedFirst()
|
||||
|
||||
guard
|
||||
type == "String" ||
|
||||
type == "Int" ||
|
||||
type == "Double" ||
|
||||
type == "Bool"
|
||||
else {
|
||||
guard let typeEnum = ParameterType(rawValue: type) else {
|
||||
let error = AnalyticsError.invalidParameter("type of \(dtoParameter.name)")
|
||||
print(error.description)
|
||||
Analytics.exit(withError: error)
|
||||
}
|
||||
|
||||
verify(value: dtoParameter.value, for: typeEnum)
|
||||
verify(value: dtoParameter.defaultValue, for: typeEnum)
|
||||
|
||||
let parameter = AnalyticsParameter(
|
||||
name: dtoParameter.name,
|
||||
type: type
|
||||
type: typeEnum,
|
||||
value: dtoParameter.value ?? "",
|
||||
defaultValue: dtoParameter.defaultValue ?? ""
|
||||
)
|
||||
|
||||
if let replaceIn = dtoParameter.replaceIn {
|
||||
@ -103,6 +130,8 @@ class AnalyticsFileParser {
|
||||
Analytics.exit(withError: error)
|
||||
}
|
||||
|
||||
definition.path = path
|
||||
} else if let path = screen.path {
|
||||
definition.path = path
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user