Bläddra i källkod

refactor: add "YaML" output format for immutable save-states

Sam Jaffe 3 veckor sedan
förälder
incheckning
2ddfb241e5
2 ändrade filer med 27 tillägg och 1 borttagningar
  1. 5 0
      Todos/Model/Category.swift
  2. 22 1
      Todos/Model/Task.swift

+ 5 - 0
Todos/Model/Category.swift

@@ -17,4 +17,9 @@ final class Category {
   init(timestamp: Date) {
     self.timestamp = timestamp
   }
+  
+  func yaml(_ indent: Int = 0) -> String {
+    return String(repeating: "  ", count: indent) +
+      "\(name):\n" + tasks.map({ $0.yaml(indent + 1) }).joined()
+  }
 }

+ 22 - 1
Todos/Model/Task.swift

@@ -9,7 +9,7 @@ import Foundation
 import SwiftData
 
 enum Status : String, CaseIterable, Identifiable, Codable {
-  case Default = ""
+  case Default = " "
   case Complete = "V"
   case InProgress = "C"
   case Hiatus = "H"
@@ -31,6 +31,16 @@ final class SubTask {
   init(name: String) {
     self.name = name
   }
+  
+  func yaml(_ indent: Int = 0) -> String {
+    let h1 = String(repeating: "  ", count: indent)
+    let h2 = String(repeating: "  ", count: indent + 1)
+    var rval = h1 + "[\(status.rawValue)] \(name)\n"
+    if !notes.isEmpty {
+      rval += h2 + "# " + notes.replacingOccurrences(of: "\n", with: "\n" + h2 + "# ")
+    }
+    return rval
+  }
 }
 
 @Model
@@ -44,4 +54,15 @@ final class Task {
   init(name: String) {
     self.name = name
   }
+  
+  func yaml(_ indent: Int = 0) -> String {
+    let h1 = String(repeating: "  ", count: indent)
+    let h2 = String(repeating: "  ", count: indent + 1)
+    var rval = "  [\(status.rawValue)] \(name) (\(tags.joined(separator: " ")))\n"
+    if !notes.isEmpty {
+      rval += h2 + "# " + notes.replacingOccurrences(of: "\n", with: "\n" + h2 + "# ")
+    }
+    rval += subtasks.map({ $0.yaml(indent + 1) }).joined()
+    return rval
+  }
 }