Task.swift 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. //
  2. // Task.swift
  3. // Todos
  4. //
  5. // Created by Sam Jaffe on 2/28/26.
  6. //
  7. import Foundation
  8. import SwiftData
  9. enum Status : String, CaseIterable, Identifiable, Codable {
  10. case Default = " "
  11. case Complete = "V"
  12. case InProgress = "C"
  13. case Hiatus = "H"
  14. case Waiting = "R"
  15. var id: Self { self }
  16. var description: String { self.rawValue }
  17. var isStrong: Bool {
  18. self == .Complete || self == .Hiatus || self == .Waiting
  19. }
  20. }
  21. @Model
  22. final class SubTask {
  23. var name: String
  24. var notes: String = ""
  25. var status: Status = Status.Default
  26. init(name: String) {
  27. self.name = name
  28. }
  29. func yaml(_ indent: Int = 0) -> String {
  30. let h1 = String(repeating: " ", count: indent)
  31. let h2 = String(repeating: " ", count: indent + 1)
  32. var rval = h1 + "[\(status.rawValue)] \(name)\n"
  33. if !notes.isEmpty {
  34. rval += h2 + "# " + notes.replacingOccurrences(of: "\n", with: "\n" + h2 + "# ")
  35. }
  36. return rval
  37. }
  38. }
  39. struct Tag : Codable, Identifiable {
  40. var id: String
  41. }
  42. @Model
  43. final class Task {
  44. var name: String
  45. var tags: [Tag] = []
  46. var subtasks: [SubTask] = []
  47. var notes: String = ""
  48. var status: Status = Status.Default
  49. init(name: String) {
  50. self.name = name
  51. }
  52. func yaml(_ indent: Int = 0) -> String {
  53. let h1 = String(repeating: " ", count: indent)
  54. let h2 = String(repeating: " ", count: indent + 1)
  55. var rval = h1 + "[\(status.rawValue)] \(name) "
  56. rval += "(\(tags.map(\.id).joined(separator: " ")))\n"
  57. if !notes.isEmpty {
  58. rval += h2 + "# " + notes.replacingOccurrences(of: "\n", with: "\n" + h2 + "# ")
  59. }
  60. rval += subtasks.map({ $0.yaml(indent + 1) }).joined()
  61. return rval
  62. }
  63. }