From 6b865ed53c2b5e3f84908bb8f80f8990febe8f6b Mon Sep 17 00:00:00 2001 From: "Sven A. Schmidt" Date: Fri, 13 Mar 2020 17:20:07 +0100 Subject: [PATCH 1/2] Add public interfaces, Hashable, Codable to some types --- Sources/ArenaCore/Dependency.swift | 8 +-- Sources/ArenaCore/Requirement.swift | 78 ++++++++++++++++++++++++++++- Sources/ArenaCore/String+ext.swift | 20 ++++++++ 3 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 Sources/ArenaCore/String+ext.swift diff --git a/Sources/ArenaCore/Dependency.swift b/Sources/ArenaCore/Dependency.swift index 6894e49..3668d4b 100644 --- a/Sources/ArenaCore/Dependency.swift +++ b/Sources/ArenaCore/Dependency.swift @@ -12,13 +12,13 @@ import Path import Parser -public struct Dependency: Equatable { - let url: URL - let requirement: Requirement +public struct Dependency: Equatable, Hashable, Codable { + public var url: URL + public var requirement: Requirement static let defaultRequirement: Requirement = .from("0.0.0") - init(url: URL, requirement: Requirement) { + public init(url: URL, requirement: Requirement) { precondition(url.scheme != nil, "scheme must not be nil (i.e. one of https, http, file)") self.url = url self.requirement = requirement diff --git a/Sources/ArenaCore/Requirement.swift b/Sources/ArenaCore/Requirement.swift index 53023f4..49a7c88 100644 --- a/Sources/ArenaCore/Requirement.swift +++ b/Sources/ArenaCore/Requirement.swift @@ -8,7 +8,7 @@ import PackageModel -public enum Requirement: Equatable { +public enum Requirement: Equatable, Hashable { case exact(Version) case range(Range) case revision(String) @@ -21,3 +21,79 @@ public enum Requirement: Equatable { return .range(version...self, forKey: .range) { + self = .range(v) + return + } + + if let v = try? container.decode(String.self, forKey: .revision) { + self = .revision(v) + return + } + + if let v = try? container.decode(String.self, forKey: .branch) { + self = .branch(v) + return + } + + if let _ = try? container.decode(String.self, forKey: .path) { + self = .path + return + } + + if let v = try? container.decode(Version.self, forKey: .from) { + self = .from(v) + return + } + + if let _ = try? container.decode(Version.self, forKey: .noVersion) { + self = .noVersion + return + } + + let context = DecodingError.Context(codingPath: container.codingPath, debugDescription: "failed to decode Requirement, none of the keys matched") + throw DecodingError.dataCorrupted(context) + } + + enum CodingKeys: CodingKey { + case exact + case range + case revision + case branch + case path + case from + case noVersion + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + switch self { + case .exact(let v): + try container.encode(v, forKey: .exact) + case .range(let v): + try container.encode(v, forKey: .range) + case .revision(let v): + try container.encode(v, forKey: .revision) + case .branch(let v): + try container.encode(v, forKey: .branch) + case .path: + try container.encode("path", forKey: .path) + case .from(let v): + try container.encode(v, forKey: .from) + case .noVersion: + try container.encode("noVersion", forKey: .noVersion) + } + } +} + diff --git a/Sources/ArenaCore/String+ext.swift b/Sources/ArenaCore/String+ext.swift new file mode 100644 index 0000000..f7e2840 --- /dev/null +++ b/Sources/ArenaCore/String+ext.swift @@ -0,0 +1,20 @@ +// +// File.swift +// +// +// Created by Sven A. Schmidt on 13/03/2020. +// + +import PackageModel +import Parser + + +extension String { + public var dependency: Dependency? { + Parser.dependency.run(self).result + } + + public var version: Version? { + Parser.version.run(self).result + } +} From 0070c8a532f206e239a1ec0364fd74937f4a7d70 Mon Sep 17 00:00:00 2001 From: "Sven A. Schmidt" Date: Fri, 13 Mar 2020 17:47:32 +0100 Subject: [PATCH 2/2] Add Arena.init with params --- Sources/ArenaCore/ArenaCommand.swift | 30 ++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Sources/ArenaCore/ArenaCommand.swift b/Sources/ArenaCore/ArenaCommand.swift index d568466..4330474 100644 --- a/Sources/ArenaCore/ArenaCommand.swift +++ b/Sources/ArenaCore/ArenaCommand.swift @@ -12,6 +12,7 @@ import ShellOut public enum ArenaError: LocalizedError { + case invalidPath(String) case missingDependency case pathExists(String) case noLibrariesFound @@ -19,6 +20,8 @@ public enum ArenaError: LocalizedError { public var errorDescription: String? { switch self { + case .invalidPath(let path): + return "'\(path)' is not a valid path" case .missingDependency: return "provide at least one dependency" case .pathExists(let path): @@ -78,6 +81,33 @@ public struct Arena: ParsableCommand { } +extension Arena { + public init(projectName: String, + libNames: [String], + platform: Platform, + force: Bool, + outputPath: String, + skipOpen: Bool, + book: Bool, + dependencies: [Dependency]) throws { + + guard let path = Path(outputPath) else { + throw ArenaError.invalidPath(outputPath) + } + + self.projectName = projectName + self.libNames = libNames + self.platform = platform + self.force = force + self.outputPath = path + self.showVersion = false + self.skipOpen = skipOpen + self.book = book + self.dependencies = dependencies + } +} + + extension Arena { var targetName: String { projectName }