Skip to content

Commit

Permalink
Add support for including Swift packages in the template specification.
Browse files Browse the repository at this point in the history
  • Loading branch information
memfrag committed Aug 15, 2023
1 parent 1aebb90 commit 0c0a4a3
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 1 deletion.
18 changes: 17 additions & 1 deletion Sources/BootstrappKit/Bootstrapp.swift
Expand Up @@ -12,19 +12,26 @@ public class Bootstrapp {
public let template: BootstrappTemplate
public var specification: BootstrappSpecification { template.specification }
public let parameters: [BootstrappParameter]
public let packages: [BootstrappPackage]
private var blacklistedDirectories: [Path] = []
private var blacklistedFiles: [Path] = []

public init(template: BootstrappTemplate, parameters: [BootstrappParameter]) {
public init(
template: BootstrappTemplate,
parameters: [BootstrappParameter],
packages: [BootstrappPackage]
) {
self.template = template
self.parameters = parameters
self.packages = packages
}

public func instantiateTemplate() throws -> Path {

var context = makeDefaultContext()
context = applySubstitutions(specification.substitutions, to: context)
context = applyParameters(parameters, to: context)
context = applyPackages(packages, to: context)

let outputPath = try prepareOutputDirectory(accordingTo: specification, with: context)
let contentPath = template.contentPath
Expand Down Expand Up @@ -106,6 +113,15 @@ public class Bootstrapp {
return context
}

private func applyPackages(
_ packages: [BootstrappPackage],
to inputContext: Context
) -> Context {
var context = inputContext
context["packages"] = packages
return context
}

// MARK: - Output Path

private func prepareOutputDirectory(accordingTo specification: BootstrappSpecification,
Expand Down
42 changes: 42 additions & 0 deletions Sources/BootstrappKit/Model/BootstrappPackage.swift
@@ -0,0 +1,42 @@
//
// Copyright © 2023 Apparata AB. All rights reserved.
//

import Foundation

public struct BootstrappPackage: Identifiable {
public var id: String { name }
public let name: String
public let url: String
public let version: String

public init(name: String, url: String, version: String) {
self.name = name
self.url = url
self.version = version
}
}

extension BootstrappPackage: Codable {

enum CodingKeys: String, CodingKey {
case id
case name
case url
case version
}

public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
name = try container.decode(String.self, forKey: .name)
url = try container.decode(String.self, forKey: .url)
version = try container.decode(String.self, forKey: .version)
}

public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(name, forKey: .name)
try container.encode(url, forKey: .url)
try container.encode(version, forKey: .version)
}
}
4 changes: 4 additions & 0 deletions Sources/BootstrappKit/Model/BootstrappSpecification.swift
Expand Up @@ -187,6 +187,7 @@ public struct BootstrappSpecification {
public let parametrizableFiles: [Regex]
public let includeDirectories: [IncludeDirectories]
public let includeFiles: [IncludeFiles]
public let packages: [BootstrappPackage]
}

extension BootstrappSpecification.ProjectType: Hashable {
Expand Down Expand Up @@ -240,6 +241,7 @@ extension BootstrappSpecification: Codable {
case parametrizableFiles
case includeDirectories
case includeFiles
case packages
}

public init(from decoder: Decoder) throws {
Expand Down Expand Up @@ -280,6 +282,7 @@ extension BootstrappSpecification: Codable {
parametrizableFiles = patterns.map { Regex("^\($0)$") }
includeDirectories = try container.decodeIfPresent([IncludeDirectories].self, forKey: .includeDirectories) ?? []
includeFiles = try container.decodeIfPresent([IncludeFiles].self, forKey: .includeFiles) ?? []
packages = try container.decodeIfPresent([BootstrappPackage].self, forKey: .packages) ?? []
}

public func encode(to encoder: Encoder) throws {
Expand Down Expand Up @@ -314,6 +317,7 @@ extension BootstrappSpecification: Codable {
try container.encode(patterns, forKey: .parametrizableFiles)
try container.encode(includeDirectories, forKey: .includeDirectories)
try container.encode(includeFiles, forKey: .includeFiles)
try container.encode(packages, forKey: .packages)
}
}

Expand Down

0 comments on commit 0c0a4a3

Please sign in to comment.