diff --git a/MasKit/Commands/Rm.swift b/MasKit/Commands/Rm.swift new file mode 100644 index 000000000..1d1e3e54f --- /dev/null +++ b/MasKit/Commands/Rm.swift @@ -0,0 +1,80 @@ +// +// Upgrade.swift +// mas-cli +// +// Created by Ben Chatelain on 2018-12-27. +// Copyright © 2015 Andrew Naylor. All rights reserved. +// + +import Commandant +import CommerceKit +import StoreFoundation + +/// Command which uninstalls apps managed by the Mac App Store. +public struct UninstallCommand: CommandProtocol { + public typealias Options = UninstallOptions + public let verb = "rm" + public let function = "Uninstall app installed from the Mac App Store" + + private let appLibrary: AppLibrary + + /// Public initializer. + /// - Parameter appLibrary: AppLibrary manager. + public init() { + self.init(appLibrary: MasAppLibrary()) + } + + /// Internal initializer. + /// - Parameter appLibrary: AppLibrary manager. + init(appLibrary: AppLibrary = MasAppLibrary()) { + self.appLibrary = appLibrary + } + + /// Runs the uninstall command. + /// + /// - Parameter options: UninstallOptions (arguments) for this command + /// - Returns: Success or an error. + public func run(_ options: Options) -> Result<(), MASError> { + let appId = UInt64(options.appId) + + guard let product = appLibrary.installedApp(forId: appId) else { + return .failure(.notInstalled) + } + + if options.dryRun { + printInfo("\(product.appName) \(product.bundlePath)") + printInfo("(not removed, dry run)") + + return .success(()) + } + + do { + try appLibrary.uninstallApp(app: product) + } catch { + return .failure(.uninstallFailed) + } + + return .success(()) + } +} + +/// Options for the uninstall command. +public struct UninstallOptions: OptionsProtocol { + /// Numeric app ID + let appId: Int + + /// Flag indicating that removal shouldn't be performed + let dryRun: Bool + + static func create(_ appId: Int) -> (_ dryRun: Bool) -> UninstallOptions { + return { dryRun in + UninstallOptions(appId: appId, dryRun: dryRun) + } + } + + public static func evaluate(_ mode: CommandMode) -> Result> { + return create + <*> mode <| Argument(usage: "ID of app to uninstall") + <*> mode <| Switch(flag: nil, key: "dry-run", usage: "dry run") + } +} diff --git a/mas/main.swift b/mas/main.swift index 096fb28ed..0c9d383b2 100644 --- a/mas/main.swift +++ b/mas/main.swift @@ -36,6 +36,7 @@ registry.register(SignInCommand()) registry.register(SignOutCommand()) registry.register(UninstallCommand()) registry.register(RemoveCommand()) +registry.register(RmCommand()) registry.register(UpgradeCommand()) registry.register(VendorCommand()) registry.register(VersionCommand())