Skip to content

Commit

Permalink
Merge pull request #30 from finestructure/public-interfaces-2
Browse files Browse the repository at this point in the history
Public interfaces
  • Loading branch information
finestructure authored Mar 13, 2020
2 parents 6e9b993 + 0070c8a commit d2f78ae
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 5 deletions.
30 changes: 30 additions & 0 deletions Sources/ArenaCore/ArenaCommand.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,16 @@ import ShellOut


public enum ArenaError: LocalizedError {
case invalidPath(String)
case missingDependency
case pathExists(String)
case noLibrariesFound
case noSourcesFound

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):
Expand Down Expand Up @@ -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 }

Expand Down
8 changes: 4 additions & 4 deletions Sources/ArenaCore/Dependency.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
78 changes: 77 additions & 1 deletion Sources/ArenaCore/Requirement.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import PackageModel


public enum Requirement: Equatable {
public enum Requirement: Equatable, Hashable {
case exact(Version)
case range(Range<Version>)
case revision(String)
Expand All @@ -21,3 +21,79 @@ public enum Requirement: Equatable {
return .range(version..<Version(version.major + 1, 0, 0))
}
}


extension Requirement: Codable {
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)

if let v = try? container.decode(Version.self, forKey: .exact) {
self = .exact(v)
return
}

if let v = try? container.decode(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)
}
}
}

20 changes: 20 additions & 0 deletions Sources/ArenaCore/String+ext.swift
Original file line number Diff line number Diff line change
@@ -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
}
}

0 comments on commit d2f78ae

Please sign in to comment.