-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathThemeFileGenerator.swift
More file actions
51 lines (37 loc) · 1.81 KB
/
ThemeFileGenerator.swift
File metadata and controls
51 lines (37 loc) · 1.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import Foundation
nonisolated public struct ThemeFileGenerator: Sendable {
nonisolated public init() {}
nonisolated public func generate(from config: ThemeConfig) -> [GeneratedFile] {
var files: [GeneratedFile] = []
// Static files (same regardless of config)
files.append(ThemeShapeStyleGenerator().generate())
files.append(EnvironmentThemeGenerator().generate())
// Conditional static files
if config.categories.contains(.shadows) {
files.append(ThemeShadowedStyleGenerator().generate())
}
// Theme root struct
files.append(ThemeStructGenerator().generate(from: config))
// Theme copyWith
files.append(CopyWithGenerator().generateForTheme(config: config))
// Per-category files
for category in config.categories {
let tokens = category.tokens(from: config)
files.append(CategoryStructGenerator().generate(category: category, tokens: tokens))
files.append(CopyWithGenerator().generateForCategory(category: category, tokens: tokens))
files.append(ShapeStyleExtensionGenerator().generate(category: category, tokens: tokens))
}
// Defaults scaffold (editable by app dev)
files.append(DefaultsGenerator().generate(from: config))
return files
}
nonisolated public func generate(fromJSON data: Data) throws -> (files: [GeneratedFile], outputPath: String) {
let themeFile = try JSONDecoder().decode(ThemeFile.self, from: data)
var files = generate(from: themeFile.styles)
// Conditionally add preview file
if themeFile.shouldGeneratePreview {
files.append(ThemePreviewGenerator().generate(from: themeFile.styles))
}
return (files, themeFile.resolvedOutputPath)
}
}