Add parse error

This commit is contained in:
Thibaut Schmitt 2023-12-11 11:19:19 +01:00 committed by Loris Perret
parent 31d20bfe2e
commit f0d9ac3337
5 changed files with 33 additions and 21 deletions

View File

@ -67,6 +67,12 @@ struct Analytics: ParsableCommand {
Analytics.exit(withError: error) Analytics.exit(withError: error)
} }
guard TrackerType.hasValidTarget(in: options.target) else {
let error = AnalyticsError.noValidTracker(options.target)
print(error.description)
Analytics.exit(withError: error)
}
// Check if needed to regenerate // Check if needed to regenerate
guard GeneratorChecker.shouldGenerate(force: options.forceGeneration, guard GeneratorChecker.shouldGenerate(force: options.forceGeneration,
inputFilePath: options.inputFile, inputFilePath: options.inputFile,
@ -78,12 +84,3 @@ struct Analytics: ParsableCommand {
return true return true
} }
} }
// MARK: - Requirements
private func checkRequirements() -> Bool {
// Check les requirements et gestion des erreurs
// Il faut que toutes les erreurs générées par Analytics soit des AnalyticsError
true
}
}

View File

@ -8,14 +8,18 @@
import Foundation import Foundation
enum AnalyticsError: Error { enum AnalyticsError: Error {
case noValidTracker(String)
case fileNotExists(String) case fileNotExists(String)
case missingElement(String) case missingElement(String)
case invalidParameter(String) case invalidParameter(String)
case parseFailed(String)
case writeFile(String, String) case writeFile(String, String)
var description: String { var description: String {
switch self { switch self {
case .noValidTracker(let inputTargets):
return "error: [\(Analytics.toolName)] '\(inputTargets)' ne contient aucun tracker valid"
case .fileNotExists(let filename): case .fileNotExists(let filename):
return "error: [\(Analytics.toolName)] File \(filename) does not exists" return "error: [\(Analytics.toolName)] File \(filename) does not exists"
@ -25,6 +29,9 @@ enum AnalyticsError: Error {
case .invalidParameter(let reason): case .invalidParameter(let reason):
return "error: [\(Analytics.toolName)] Invalid parameter \(reason)" return "error: [\(Analytics.toolName)] Invalid parameter \(reason)"
case .parseFailed(let baseError):
return "error: [\(Analytics.toolName)] Parse input file failed: \(baseError)"
case .writeFile(let subErrorDescription, let filename): case .writeFile(let subErrorDescription, let filename):
return "error: [\(Analytics.toolName)] An error occured while writing content to \(filename): \(subErrorDescription)" return "error: [\(Analytics.toolName)] An error occured while writing content to \(filename): \(subErrorDescription)"
} }

View File

@ -19,4 +19,11 @@ enum TrackerType: CaseIterable {
"firebase" "firebase"
} }
} }
static func hasValidTarget(in targets: String) -> Bool {
for tracker in Self.allCases where targets.contains(tracker.value) {
return true
}
return false
}
} }

View File

@ -22,7 +22,8 @@ class AnalyticsFileParser {
do { do {
let tagFile = try YAMLDecoder().decode(AnalyticsFile.self, from: data) let tagFile = try YAMLDecoder().decode(AnalyticsFile.self, from: data)
return tagFile return tagFile
} catch let error { } catch {
let error = AnalyticsError.parseFailed(error.localizedDescription)
print(error.description) print(error.description)
Analytics.exit(withError: error) Analytics.exit(withError: error)
} }
@ -32,7 +33,7 @@ class AnalyticsFileParser {
parameters.map { dtoParameter in parameters.map { dtoParameter in
// Type // Type
let type = value.type.uppercasedFirst() let type = dtoParameter.type.uppercasedFirst()
guard guard
type == "String" || type == "String" ||
@ -40,7 +41,7 @@ class AnalyticsFileParser {
type == "Double" || type == "Double" ||
type == "Bool" type == "Bool"
else { else {
let error = AnalyticsError.invalidParameter("type of \(value.name)") let error = AnalyticsError.invalidParameter("type of \(dtoParameter.name)")
print(error.description) print(error.description)
Analytics.exit(withError: error) Analytics.exit(withError: error)
} }
@ -93,7 +94,7 @@ class AnalyticsFileParser {
parameters: screen.parameters parameters: screen.parameters
) )
if target.contains(Analytics.TargetType.matomo.value) { if target.contains(TrackerType.matomo.value) {
// Path // Path
guard let path = screen.path else { guard let path = screen.path else {
@ -120,7 +121,7 @@ class AnalyticsFileParser {
parameters: event.parameters parameters: event.parameters
) )
if target.contains(Analytics.TargetType.matomo.value) { if target.contains(TrackerType.matomo.value) {
// Category // Category
guard let category = event.category else { guard let category = event.category else {
let error = AnalyticsError.missingElement("event category") let error = AnalyticsError.missingElement("event category")

View File

@ -51,7 +51,7 @@ final class AnalyticsGeneratorTests: XCTestCase {
] ]
// When // When
AnalyticsGenerator.targets = [Analytics.TargetType.firebase] AnalyticsGenerator.targets = [TrackerType.firebase]
let extensionContent = AnalyticsGenerator.getExtensionContent(sections: [sectionOne, sectionTwo, sectionThree], let extensionContent = AnalyticsGenerator.getExtensionContent(sections: [sectionOne, sectionTwo, sectionThree],
tags: ["ios", "iosonly"], tags: ["ios", "iosonly"],
staticVar: false, staticVar: false,
@ -216,7 +216,7 @@ final class AnalyticsGeneratorTests: XCTestCase {
] ]
// When // When
AnalyticsGenerator.targets = [Analytics.TargetType.matomo] AnalyticsGenerator.targets = [TrackerType.matomo]
let extensionContent = AnalyticsGenerator.getExtensionContent(sections: [sectionOne, sectionTwo, sectionThree], let extensionContent = AnalyticsGenerator.getExtensionContent(sections: [sectionOne, sectionTwo, sectionThree],
tags: ["ios", "iosonly"], tags: ["ios", "iosonly"],
staticVar: false, staticVar: false,
@ -409,7 +409,7 @@ final class AnalyticsGeneratorTests: XCTestCase {
] ]
// When // When
AnalyticsGenerator.targets = [Analytics.TargetType.matomo, Analytics.TargetType.firebase] AnalyticsGenerator.targets = [TrackerType.matomo, TrackerType.firebase]
let extensionContent = AnalyticsGenerator.getExtensionContent(sections: [sectionOne, sectionTwo, sectionThree], let extensionContent = AnalyticsGenerator.getExtensionContent(sections: [sectionOne, sectionTwo, sectionThree],
tags: ["ios", "iosonly"], tags: ["ios", "iosonly"],
staticVar: false, staticVar: false,