-
-
Notifications
You must be signed in to change notification settings - Fork 541
/
Generator.swift
95 lines (80 loc) · 3.99 KB
/
Generator.swift
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import Basic
import Foundation
import TuistCore
struct GeneratorConfig {
static let `default` = GeneratorConfig()
var options: GenerationOptions
var directory: GenerationDirectory
init(options: GenerationOptions = GenerationOptions(),
directory: GenerationDirectory = .manifest) {
self.options = options
self.directory = directory
}
}
protocol Generating {
func generateProject(at path: AbsolutePath, config: GeneratorConfig, workspaceFiles: [AbsolutePath]) throws -> AbsolutePath
func generateWorkspace(at path: AbsolutePath, config: GeneratorConfig, workspaceFiles: [AbsolutePath]) throws -> AbsolutePath
}
extension Generating {
func generate(at path: AbsolutePath,
config: GeneratorConfig,
manifestLoader: GraphManifestLoading) throws -> AbsolutePath {
let manifests = manifestLoader.manifests(at: path)
let workspaceFiles: [AbsolutePath] = [Manifest.workspace, Manifest.setup]
.compactMap { try? manifestLoader.manifestPath(at: path, manifest: $0) }
if manifests.contains(.workspace) {
return try generateWorkspace(at: path, config: config, workspaceFiles: workspaceFiles)
} else if manifests.contains(.project) {
return try generateProject(at: path, config: config, workspaceFiles: workspaceFiles)
} else {
throw GraphManifestLoaderError.manifestNotFound(path)
}
}
}
class Generator: Generating {
private let graphLoader: GraphLoading
private let workspaceGenerator: WorkspaceGenerating
convenience init(system: Systeming = System(),
printer: Printing = Printer(),
fileHandler: FileHandling = FileHandler(),
modelLoader: GeneratorModelLoading) {
let graphLoader = GraphLoader(printer: printer, modelLoader: modelLoader)
let workspaceGenerator = WorkspaceGenerator(system: system,
printer: printer,
projectDirectoryHelper: ProjectDirectoryHelper(),
fileHandler: fileHandler)
self.init(graphLoader: graphLoader,
workspaceGenerator: workspaceGenerator)
}
init(graphLoader: GraphLoading,
workspaceGenerator: WorkspaceGenerating) {
self.graphLoader = graphLoader
self.workspaceGenerator = workspaceGenerator
}
func generateProject(at path: AbsolutePath,
config: GeneratorConfig,
workspaceFiles: [AbsolutePath]) throws -> AbsolutePath {
let (graph, project) = try graphLoader.loadProject(path: path)
let workspace = Workspace(name: project.name,
projects: graph.projectPaths,
additionalFiles: workspaceFiles.map(Workspace.Element.file))
return try workspaceGenerator.generate(workspace: workspace,
path: path,
graph: graph,
options: config.options,
directory: config.directory)
}
func generateWorkspace(at path: AbsolutePath,
config: GeneratorConfig,
workspaceFiles: [AbsolutePath]) throws -> AbsolutePath {
let (graph, workspace) = try graphLoader.loadWorkspace(path: path)
let updatedWorkspace = workspace
.merging(projects: graph.projectPaths)
.adding(files: workspaceFiles)
return try workspaceGenerator.generate(workspace: updatedWorkspace,
path: path,
graph: graph,
options: config.options,
directory: config.directory)
}
}