Skip to content

Commit 3581f72

Browse files
committed
feat: support overriding baseURL parameter via a commandline option
1 parent 0c07c0e commit 3581f72

9 files changed

Lines changed: 57 additions & 26 deletions

File tree

Sources/AssetConfig/Common/CommonMetadata.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Foundation
33
public protocol CommonMetadata {
44
associatedtype TraitDataType: CommonTraitData
55

6-
var baseUrl: URL { get }
6+
var baseUrl: URL? { get }
77
var nameFormat: String { get }
88
var descriptionFormat: String { get }
99
var externalUrlFormat: String? { get }

Sources/AssetConfigLoader/Codables/AssetConfigCodable.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ struct AssetConfigCodable: CommonAssetConfig, SummonAssetConfig, EnchantAssetCon
9595
struct MetadataCodable: CommonMetadata, EnchantMetadata, Codable, Equatable, DefaultValueProvider {
9696
static let `default`: Self = .init()
9797

98-
@Default<BlankURL> var baseUrl: URL
98+
@Default<Nil> var baseUrl: URL?
9999
@Default<Empty> var nameFormat: String
100100
@Default<Empty> var descriptionFormat: String
101101
@Default<Nil> var externalUrlFormat: String?

Sources/AssetConfigLoader/Codables/DefaultValues.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,6 @@ enum FontMidiumSize: DefaultValueProvider {
2929
public static let `default`: CGFloat = 14
3030
}
3131

32-
enum BlankURL: DefaultValueProvider {
33-
public static let `default` = URL(fileURLWithPath: "")
34-
}
35-
3632
enum Nil<T>: DefaultValueProvider where T: Equatable, T: Codable {
3733
public static var `default`: T? { nil }
3834
}

Sources/BoilerplateCommand/BoilerplateAssetConfig.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ struct BoilerplateAssetConfig: SummonAssetConfig, Encodable {
5151
}
5252

5353
struct BoilerplateMetadata: CommonMetadata, Encodable {
54-
let baseUrl: URL
54+
let baseUrl: URL?
5555
let nameFormat: String
5656
let descriptionFormat: String
5757
let externalUrlFormat: String?
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import Foundation
2+
import SwiftCLI
3+
4+
extension URL: ConvertibleFromString {
5+
public init?(input: String) {
6+
self.init(string: input)
7+
}
8+
}

Sources/EnchantCommand/EnchantCommand.swift

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ public class EnchantCommand: Command {
4141
@Key("-r", "--reprint", description: "Pickup assets based on data.sqlite file", completion: .filename)
4242
var sqliteFile: File?
4343

44+
@Key("--baseurl", description: "Base URL to place metadata (default is difined in config.json)", completion: .none)
45+
var baseURL: URL?
46+
4447
@Flag("-e", "--embedded", description: "Embed encoded image in metadata")
4548
var embedDecodedImageInMetadata: Bool
4649

@@ -155,22 +158,30 @@ private extension EnchantCommand {
155158
let exifReader = ExifReader(fileURL: assetFile.url)
156159
let spells = exifReader.spells.map(\.phrase)
157160

158-
switch metadataFactory.generateMetadata(from: .completedAsset(name: assetFile.nameExcludingExtension, spells: spells, config: config), as: nameFactory.fileName(from: index), serial: index, imageType: fileType, embededImage: imageData) {
159-
case let .success(file):
160-
stdout <<< "Created: \(file.path)"
161-
return true
162-
case let .failure(error):
163-
switch error {
164-
case .creatingFileFailed:
165-
stderr <<< "Couldn't create file to write metadata."
166-
case .invalidMetadataSortConfig:
167-
stderr <<< "Sorting metadata config should cover all trait you defined."
168-
case .invalidBackgroundColorCode:
169-
stderr <<< "backgroundColor in metadata should be 3 or 6 hex code without # prefix."
170-
case .writingFileFailed:
171-
stderr <<< "Writing metadata failed."
172-
}
173-
return false
161+
switch metadataFactory.generateMetadata(
162+
from: .completedAsset(name: assetFile.nameExcludingExtension, spells: spells, config: config),
163+
as: nameFactory.fileName(from: index),
164+
serial: index,
165+
imageType: fileType,
166+
overrideBaseURL: baseURL,
167+
embededImage: imageData) {
168+
case let .success(file):
169+
stdout <<< "Created: \(file.path)"
170+
return true
171+
case let .failure(error):
172+
switch error {
173+
case .creatingFileFailed:
174+
stderr <<< "Couldn't create file to write metadata."
175+
case .invalidMetadataSortConfig:
176+
stderr <<< "Sorting metadata config should cover all trait you defined."
177+
case .invalidBackgroundColorCode:
178+
stderr <<< "backgroundColor in metadata should be 3 or 6 hex code without # prefix."
179+
case .writingFileFailed:
180+
stderr <<< "Writing metadata failed."
181+
case .undifinedBaseURL:
182+
stderr <<< "BaseURL is not defined."
183+
}
184+
return false
174185
}
175186
}
176187

Sources/MetadataFactory/MetadataFactory.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public struct MetadataFactory {
1717

1818
public extension MetadataFactory {
1919
@discardableResult
20-
func generateMetadata(from subject: MetadataSubject, as name: String, serial: Int, imageType: UTType, embededImage: Data? = nil) -> Result<File, MetadataFactoryError> {
20+
func generateMetadata(from subject: MetadataSubject, as name: String, serial: Int, imageType: UTType, overrideBaseURL: URL? = nil, embededImage: Data? = nil) -> Result<File, MetadataFactoryError> {
2121
guard let jsonFile = try? outputFolder.createFileIfNeeded(withName: "\(name).json") else { return .failure(.creatingFileFailed) }
2222

2323
let attributes = attributes(subject: subject)
@@ -28,14 +28,18 @@ public extension MetadataFactory {
2828
}
2929

3030
let config = subject.config
31+
guard let baseURL = overrideBaseURL ?? config.baseUrl else {
32+
try? jsonFile.delete()
33+
return .failure(.undifinedBaseURL)
34+
}
3135

3236
// sort attributes
3337
guard let sortedAttribute = sort(attributes: attributes, traitOrder: config.traitOrder) else {
3438
try? jsonFile.delete()
3539
return .failure(.invalidMetadataSortConfig)
3640
}
3741

38-
let imageURLType = embededImage.map(ImageURLType.dataURL(data: )) ?? .locationURL(baseURL: config.baseUrl, name: name)
42+
let imageURLType = embededImage.map(ImageURLType.dataURL(data: )) ?? .locationURL(baseURL: baseURL, name: name)
3943
let imageURL = imageURL(urlType: imageURLType, imageType: imageType)
4044

4145
let name = replace(in: config.nameFormat, attributes: attributes, serial: serial)

Sources/MetadataFactory/MetadataFactoryError.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ public enum MetadataFactoryError: Error {
33
case invalidMetadataSortConfig
44
case invalidBackgroundColorCode
55
case writingFileFailed
6+
case undifinedBaseURL
67
}

Sources/SummonCommand/SummonCommand.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ public class SummonCommand: Command {
5050
@Key("-t", "--type", description: "Type to generate image (default is gif)", completion: .values([(name: "gif", description: ""), (name: "png", description: "")]), validation: [.custom("unsupported image type") { $0 == .gif || $0 == .png }])
5151
var imageType: UTType!
5252

53+
@Key("--baseurl", description: "Base URL to place metadata (default is difined in config.json)", completion: .none)
54+
var baseURL: URL?
55+
5356
@Flag("-e", "--embedded", description: "Embed encoded image in metadata")
5457
var embedDecodedImageInMetadata: Bool
5558

@@ -276,7 +279,13 @@ private extension SummonCommand {
276279
guard !noMetadata else { return .nothing }
277280
let imageData = embedDecodedImageInMetadata ? data : nil
278281

279-
switch metadataFactory.generateMetadata(from: input.assets.metadataSubject(config: config), as: nameFactory.fileName(from: index), serial: index, imageType: imageType, embededImage: imageData) {
282+
switch metadataFactory.generateMetadata(
283+
from: input.assets.metadataSubject(config: config),
284+
as: nameFactory.fileName(from: index),
285+
serial: index,
286+
imageType: imageType,
287+
overrideBaseURL: baseURL,
288+
embededImage: imageData) {
280289
case let .success(file):
281290
stdout <<< "Created: \(file.path)"
282291
return .success(file: file)
@@ -290,6 +299,8 @@ private extension SummonCommand {
290299
stderr <<< "backgroundColor in metadata should be 3 or 6 hex code without # prefix."
291300
case .writingFileFailed:
292301
stderr <<< "Writing metadata failed."
302+
case .undifinedBaseURL:
303+
stderr <<< "BaseURL is not defined."
293304
}
294305
return .failure
295306
}

0 commit comments

Comments
 (0)