rocket/Sources/RocketLib/Executors/Utils/DevDependenciesModifier.swift

64 lines
2.0 KiB
Swift

protocol DevDependenciesModifing {
func hideDependencies(packagePath: String) throws
func unhideDependencies(packagePath: String) throws
}
struct DevDependenciesModifier: DevDependenciesModifing {
private let commentString = "//"
private enum Action {
case hide
case unhide
}
func hideDependencies(packagePath: String) throws {
try modifyDevDependencies(packagePath: packagePath, action: .hide)
}
func unhideDependencies(packagePath: String) throws {
try modifyDevDependencies(packagePath: packagePath, action: .unhide)
}
private func modifyDevDependencies(packagePath: String, action: Action) throws {
let packageContent = try String(contentsOfFile: packagePath)
let lines = packageContent.components(separatedBy: .newlines)
var result = packageContent
lines.forEach { line in
if isDevDependencyLine(line: line) {
switch action {
case .hide:
result = result.replacingOccurrences(of: line, with: hideDependencyOnLine(line))
case .unhide:
if line.hasPrefix(commentString) {
result = result.replacingOccurrences(of: line, with: unhideDependencyOnLine(line))
}
}
}
}
try result.write(toFile: packagePath, atomically: true, encoding: .utf8)
}
private func hideDependencyOnLine(_ line: String) -> String {
return commentString + line
}
private func unhideDependencyOnLine(_ line: String) -> String {
let devDependencyStartIndex: String.Index
#if swift(>=5.0)
devDependencyStartIndex = String.Index(utf16Offset: 2, in: line)
#else
devDependencyStartIndex = String.Index(encodedOffset: 2)
#endif
return String(line[devDependencyStartIndex ..< line.endIndex])
}
private func isDevDependencyLine(line: String) -> Bool {
return line.contains("// dev") || line.contains("//dev")
}
}