import Foundation /// What `mr list` is narrowed to. The command takes no `--label` and no /// `--assignee`, so this offers neither. nonisolated struct MRFilter: Equatable, Sendable { enum State: String, CaseIterable, Identifiable, Sendable { case open, merged, closed case sourceGone = "source_gone" case all var id: String { rawValue } var label: String { self == .sourceGone ? "Source gone" : rawValue.capitalized } } var state: State = .open var search = "" var author: String? var milestone: String? func flags() -> [String] { var flags = ["--state", state.rawValue] flags += filterFlag("--search", search) flags += filterFlag("--author", author) flags += filterFlag("--milestone", milestone) return flags } var isNarrowed: Bool { flags().count > 2 } var emptyMessage: String { let noun = "merge requests" if isNarrowed { return state == .all ? "No \(noun) match these filters." : "No \(state.label.lowercased()) \(noun) match these filters." } return state == .all ? "No \(noun)." : "No \(state.label.lowercased()) \(noun)." } }