Skip to content

Commit

Permalink
Implement trigger-binding command
Browse files Browse the repository at this point in the history
  • Loading branch information
nikitabobko committed May 19, 2024
1 parent d3562f8 commit 35b6c7b
Show file tree
Hide file tree
Showing 12 changed files with 102 additions and 1 deletion.
1 change: 1 addition & 0 deletions Sources/AppBundle/TrayMenuModel.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import AppKit
import Common

public class TrayMenuModel: ObservableObject {
public static let shared = TrayMenuModel()
Expand Down
5 changes: 5 additions & 0 deletions Sources/AppBundle/command/Command.swift
Original file line number Diff line number Diff line change
Expand Up @@ -97,3 +97,8 @@ extension CommandSubject {
}
}
}

func failCmdWithMsg(_ state: CommandMutableState, _ msg: String) -> Bool {
state.stderr.append(msg)
return false
}
20 changes: 20 additions & 0 deletions Sources/AppBundle/command/TriggerBindingCommand.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import AppKit
import Common

struct TriggerBindingCommand: Command {
let args: TriggerBindingCmdArgs

func _run(_ state: CommandMutableState, stdin: String) -> Bool {
check(Thread.current.isMainThread)
return if let mode = config.modes[args.mode] {
if let binding = mode.bindings[args.binding.val] {
refreshSession(forceFocus: true) { binding.commands.run(state) }
} else {
failCmdWithMsg(state, "Binding '\(args.binding)' is not presented in mode '\(args.mode)'")
}
} else {
failCmdWithMsg(state, "Mode '\(args.mode)' doesn't exist. " +
"Available modes: \(config.modes.keys.joined(separator: ","))")
}
}
}
2 changes: 2 additions & 0 deletions Sources/AppBundle/command/other/parseCommand.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ extension CmdArgs {
command = SplitCommand(args: self as! SplitCmdArgs)
case .serverVersionInternalCommand:
command = ServerVersionInternalCommandCommand()
case .triggerBinding:
command = TriggerBindingCommand(args: self as! TriggerBindingCmdArgs)
case .workspace:
command = WorkspaceCommand(args: self as! WorkspaceCmdArgs)
case .workspaceBackAndForth:
Expand Down
1 change: 0 additions & 1 deletion Sources/AppBundle/config/Config.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import AppKit
import HotKey
import Common

let mainModeId = "main"
var defaultConfigUrl: URL {
if isUnitTest {
var url = URL(filePath: #file)
Expand Down
1 change: 1 addition & 0 deletions Sources/AppBundle/config/HotkeyBinding.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import AppKit
import Common
import Foundation
import HotKey
import TOMLKit
Expand Down
33 changes: 33 additions & 0 deletions Sources/Common/cmdArgs/TriggerBindingCmdArgs.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
public struct TriggerBindingCmdArgs: RawCmdArgs, CmdArgs {
public let rawArgs: EquatableNoop<[String]>
public static let parser: CmdParser<Self> = cmdParser(
kind: .triggerBinding,
allowInConfig: true,
help: """
USAGE: trigger-binding [-h|--help] <binding> --mode <mode-id>
OPTIONS:
-h, --help Print help
--mode <mode-id> Mode to search <binding> in
ARGUMENTS:
<binding> Binding to trigger
""",
options: [
"--mode": singleValueOption(\._mode, "<mode-id>", { $0 })
],
arguments: [newArgParser(\.binding, { arg, _ in .success(arg) }, mandatoryArgPlaceholder: "<binding>")]
)

public var _mode: String? = nil
public var binding: Lateinit<String> = .uninitialized
}

public extension TriggerBindingCmdArgs {
var mode: String { _mode! }
}

public func parseTriggerBindingCmdArgs(_ args: [String]) -> ParsedCmd<TriggerBindingCmdArgs> {
parseRawCmdArgs(TriggerBindingCmdArgs(rawArgs: .init(args)), args)
.filter("--mode flag is mandatory") { $0._mode != nil }
}
1 change: 1 addition & 0 deletions Sources/Common/cmdArgs/other/CmdKind.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ public enum CmdKind: String, CaseIterable, Equatable {
case reloadConfig = "reload-config"
case resize
case split
case triggerBinding = "trigger-binding"
case workspace
case workspaceBackAndForth = "workspace-back-and-forth"

Expand Down
2 changes: 2 additions & 0 deletions Sources/Common/cmdArgs/other/parseCmdArgs.swift
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ private func initSubcommands() -> [String: any SubCommandParserProtocol] {
if isServer {
result[kind.rawValue] = defaultSubCommandParser(ServerVersionInternalCommandCmdArgs.init)
}
case .triggerBinding:
result[kind.rawValue] = SubCommandParser(parseTriggerBindingCmdArgs)
case .workspace:
result[kind.rawValue] = SubCommandParser(parseWorkspaceCmdArgs)
case .workspaceBackAndForth:
Expand Down
1 change: 1 addition & 0 deletions Sources/Common/util/commonUtil.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import Foundation
import AppKit

public let mainModeId = "main"
private var recursionDetectorDuringFailure: Bool = false

public func errorT<T>(
Expand Down
29 changes: 29 additions & 0 deletions docs/aerospace-trigger-binding.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
= aerospace-trigger-binding(1)
include::util/man-attributes.adoc[]
:manname: aerospace-trigger-binding
// tag::purpose[]
:manpurpose: Trigger AeroSpace binding as if it was pressed by user
// end::purpose[]

== Synopsis
// tag::synopsis[]
aerospace trigger-binding [-h|--help] <binding> --mode <mode-id>
// end::synopsis[]

== Description

// tag::body[]
{manpurpose}

include::util/conditional-options-header.adoc[]

-h, --help:: Print help
--mode <mode-id>:: Mode to search `<binding>` in

include::util/conditional-arguments-header.adoc[]

<binding>:: Binding to trigger

// end::body[]

include::util/man-footer.adoc[]
7 changes: 7 additions & 0 deletions docs/commands.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,13 @@ include::aerospace-split.adoc[tags=synopsis]
include::aerospace-split.adoc[tags=purpose]
include::aerospace-split.adoc[tags=body]

== trigger-binding
----
include::aerospace-trigger-binding.adoc[tags=synopsis]
----
include::aerospace-trigger-binding.adoc[tags=purpose]
include::aerospace-trigger-binding.adoc[tags=body]

== workspace
----
include::aerospace-workspace.adoc[tags=synopsis]
Expand Down

0 comments on commit 35b6c7b

Please sign in to comment.