import Foundation /// A write the app makes: a procedure, and what it's given. They're all here so /// that `ios/check-models.sh` can hold each to its lexicon, with no server. struct Write: Sendable { let method: String let input: [String: String] var numbers: [String: Int] = [:] var notifications: NotificationChoices? /// What it's given, as it's sent. var body: [String: Any] { var all: [String: Any] = input for (name, number) in numbers { all[name] = number } if let notifications { all["preferences"] = [notifications.written] } return all } } enum Writes { /// `verdict` makes it a review: `approve` or `changes`. static func comment(repo: RepoRef, subject: String, body: String, verdict: String?) -> Write { var input = ["repo": repo.uri, "subject": subject, "body": body] if let verdict { input["verdict"] = verdict } return Write(method: "createComment", input: input) } static func issue(repo: RepoRef, title: String, body: String) -> Write { var input = ["repo": repo.uri, "title": title] if !body.isEmpty { input["body"] = body } return Write(method: "createIssue", input: input) } static func react(repo: RepoRef, subject: String, content: String, undo: Bool) -> Write { Write(method: undo ? "removeReaction" : "addReaction", input: ["repo": repo.uri, "subject": subject, "content": content]) } /// `open` or `closed`. static func setState(repo: RepoRef, subject: String, state: String) -> Write { Write(method: "setItemState", input: ["repo": repo.uri, "subject": subject, "state": state]) } static func merge(repo: RepoRef, pull: String) -> Write { Write(method: "mergePull", input: ["repo": repo.uri, "pull": pull]) } static func queue(repo: RepoRef, pull: String) -> Write { Write(method: "queuePull", input: ["repo": repo.uri, "pull": pull]) } static func leaveQueue(repo: RepoRef, pull: String) -> Write { Write(method: "leaveQueue", input: ["repo": repo.uri, "pull": pull]) } static func star(repo: RepoRef, undo: Bool) -> Write { Write(method: undo ? "unstarRepo" : "starRepo", input: ["repo": repo.uri]) } static func fork(repo: RepoRef) -> Write { Write(method: "forkRepo", input: ["repo": repo.uri]) } /// `all`, `releases` or `ignore`, or `participating` to forget the choice. static func hear(repo: RepoRef, level: String) -> Write { Write(method: "putSubscription", input: ["subject": repo.uri, "level": level]) } static func follow(did: String, undo: Bool) -> Write { Write(method: undo ? "unfollowActor" : "followActor", input: ["subject": did]) } /// `subject` is a DID, a repository's knotless:// URL or a record's at:// URI. static func report(subject: String, reason: String, text: String) -> Write { var input = ["subject": subject, "reason": reason] if !text.isEmpty { input["text"] = text } return Write(method: "createReport", input: input) } /// From all the account's repositories, or the one `repo` names. static func block(subject: String, repo: String? = nil, undo: Bool) -> Write { var input = ["subject": subject] if let repo { input["repo"] = repo } return Write(method: undo ? "unblockActor" : "blockActor", input: input) } /// One part of it: asked again, it carries on. static func deleteData(did: String, limit: Int) -> Write { Write(method: "deleteAccountData", input: ["did": did], numbers: ["limit": limit]) } /// All of them, as the server takes them whole. static func notifications(_ choices: NotificationChoices) -> Write { Write(method: "putPreferences", input: [:], notifications: choices) } /// A pull's, an issue's or a comment's body, which only who wrote it may change. static func edit(repo: RepoRef, subject: String, body: String) -> Write { Write(method: "editItem", input: ["repo": repo.uri, "subject": subject, "body": body]) } /// Takes back one's own comment or review. static func deleteComment(repo: RepoRef, subject: String) -> Write { Write(method: "deleteComment", input: ["repo": repo.uri, "subject": subject]) } /// The runners run a pull's head, or a ref, again: all its workflows, or `workflow`. static func rerun(repo: RepoRef, pull: String?, ref: String?, workflow: String?) -> Write { var input = ["repo": repo.uri] if let pull { input["pull"] = pull } else if let ref { input["ref"] = ref } if let workflow { input["workflow"] = workflow } return Write(method: "requestRerun", input: input) } static func seen(at: String) -> Write { Write(method: "updateSeen", input: ["seenAt": at]) } /// `environment` is `production` or `sandbox`. static func registerPush(token: String, environment: String) -> Write { Write(method: "registerPush", input: ["token": token, "environment": environment]) } static func unregisterPush(token: String) -> Write { Write(method: "unregisterPush", input: ["token": token]) } }