From 187980933e8e5ae6a18bd13c2dc7cebe3552e4a4 Mon Sep 17 00:00:00 2001 From: Thibaut Schmitt Date: Thu, 17 Jul 2025 09:40:08 +0200 Subject: [PATCH] Optional generation of Colors extension --- README.md | 2 +- Sources/ResgenSwift/Colors/Colors.swift | 59 ++++++++++++------- .../Colors/ColorsToolOptions.swift | 28 +++++---- 3 files changed, 56 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 3b85ede..311ddc5 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ swift run -c release ResgenSwift fonts $FORCE_FLAG "./Fonts/fonts.txt" \ ## Colors -Colors generator generates an extension of `UIColor` (or a custom class) along with colorsets in specified xcassets. +Colors generator generates colorsets in specified xcassets and an extension of `Color` (or a custom class) associated to those colorsets. If the extension name is not specified, no extension will be generated. ```sh swift run -c release ResgenSwift colors $FORCE_FLAG "./Colors/colors.txt" \ diff --git a/Sources/ResgenSwift/Colors/Colors.swift b/Sources/ResgenSwift/Colors/Colors.swift index 0d5cab2..89ee25b 100644 --- a/Sources/ResgenSwift/Colors/Colors.swift +++ b/Sources/ResgenSwift/Colors/Colors.swift @@ -21,8 +21,6 @@ struct Colors: ParsableCommand { // MARK: - Static static let toolName = "Color" - static let defaultExtensionName = "Color" - static let defaultExtensionNameUIKit = "UIColor" static let assetsColorsFolderName = "Colors" // MARK: - Command options @@ -57,22 +55,28 @@ struct Colors: ParsableCommand { // -> Time: 3.4505380392074585 seconds // Generate extension - ColorExtensionGenerator.writeExtensionFile( - colors: parsedColors, - staticVar: options.staticMembers, - extensionName: options.extensionName, - extensionFilePath: options.extensionFilePath, - isSwiftUI: true - ) + if let extensionName = options.extensionName, + let extensionFilePath = options.extensionFilePath { + ColorExtensionGenerator.writeExtensionFile( + colors: parsedColors, + staticVar: options.staticMembers, + extensionName: extensionName, + extensionFilePath: extensionFilePath, + isSwiftUI: true + ) + } // Generate extension - ColorExtensionGenerator.writeExtensionFile( - colors: parsedColors, - staticVar: options.staticMembers, - extensionName: options.extensionNameUIKit, - extensionFilePath: options.extensionFilePathUIKit, - isSwiftUI: false - ) + if let extensionNameUIKit = options.extensionNameUIKit, + let extensionFilePathUIKit = options.extensionFilePathUIKit { + ColorExtensionGenerator.writeExtensionFile( + colors: parsedColors, + staticVar: options.staticMembers, + extensionName: extensionNameUIKit, + extensionFilePath: extensionFilePathUIKit, + isSwiftUI: false + ) + } print("[\(Self.toolName)] Colors generated") } @@ -96,18 +100,29 @@ struct Colors: ParsableCommand { Self.exit(withError: error) } - // Extension for UIKit and SwiftUI should have different name - guard options.extensionName != options.extensionNameUIKit else { - let error = ColorsToolError.extensionNamesCollision(options.extensionName) - print(error.description) - Self.exit(withError: error) + // Extension for UIKit and SwiftUI should have different name (if both are defined) + if let extensionName = options.extensionName, + let extensionNameUIKit = options.extensionNameUIKit { + guard extensionName != extensionNameUIKit else { + let error = ColorsToolError.extensionNamesCollision(extensionName) + print(error.description) + Self.exit(withError: error) + } } // Check if needed to regenerate + let fileToCompareToInput: String = { + // If there is no extension file to compare + // Then check the xcassets file instead + if let extensionFilePath = options.extensionFilePath { + return extensionFilePath + } + return options.xcassetsPath + }() guard GeneratorChecker.shouldGenerate( force: options.forceGeneration, inputFilePath: options.inputFile, - extensionFilePath: options.extensionFilePath + extensionFilePath: fileToCompareToInput ) else { print("[\(Self.toolName)] Colors are already up to date :) ") return false diff --git a/Sources/ResgenSwift/Colors/ColorsToolOptions.swift b/Sources/ResgenSwift/Colors/ColorsToolOptions.swift index 97eb31d..742587c 100644 --- a/Sources/ResgenSwift/Colors/ColorsToolOptions.swift +++ b/Sources/ResgenSwift/Colors/ColorsToolOptions.swift @@ -30,11 +30,11 @@ struct ColorsToolOptions: ParsableArguments { @Option(help: "Tell if it will generate static properties or not") var staticMembers: Bool = false - @Option(help: "Extension name. If not specified, it will generate an Color extension.") - var extensionName: String = Colors.defaultExtensionName + @Option(help: "Extension name. If not specified, no extension will be generated.") + var extensionName: String? - @Option(help: "SwiftUI Extension name. If not specified, it will generate an UIColor extension.") - var extensionNameUIKit: String = Colors.defaultExtensionNameUIKit + @Option(help: "SwiftUI Extension name. If not specified, no extension will be generated.") + var extensionNameUIKit: String? @Option(help: "Extension suffix. Ex: MyApp, it will generate {extensionName}+ColorsMyApp.swift") var extensionSuffix: String? @@ -46,27 +46,35 @@ extension ColorsToolOptions { // MARK: - SwiftUI - var extensionFileName: String { + var extensionFileName: String? { + guard let extensionName else { return nil } + if let extensionSuffix { return "\(extensionName)+\(extensionSuffix).swift" } return "\(extensionName).swift" } - var extensionFilePath: String { - "\(extensionOutputPath)/\(extensionFileName)" + var extensionFilePath: String? { + guard let extensionFileName else { return nil } + + return "\(extensionOutputPath)/\(extensionFileName)" } // MARK: - UIKit - var extensionFileNameUIKit: String { + var extensionFileNameUIKit: String? { + guard let extensionNameUIKit else { return nil } + if let extensionSuffix { return "\(extensionNameUIKit)+\(extensionSuffix).swift" } return "\(extensionNameUIKit).swift" } - var extensionFilePathUIKit: String { - "\(extensionOutputPath)/\(extensionFileNameUIKit)" + var extensionFilePathUIKit: String? { + guard let extensionFileNameUIKit else { return nil } + + return "\(extensionOutputPath)/\(extensionFileNameUIKit)" } }