import Foundation struct ContactMetadata { var isFavorite: Bool = false var isMyCard: Bool = false var hasAnyValue: Bool { isFavorite || isMyCard } } enum ContactMetadataDSL { private static let startMarker = "[[kontakte]]" private static let endMarker = "[[/kontakte]]" static func parse(note: String) -> ContactMetadata { guard let range = metadataBlockRange(in: note) else { return ContactMetadata() } let block = note[range] var metadata = ContactMetadata() for rawLine in block.components(separatedBy: .newlines) { let line = rawLine.trimmingCharacters(in: .whitespacesAndNewlines) if line == "favorite=1" { metadata.isFavorite = true } else if line == "my_card=1" { metadata.isMyCard = true } } return metadata } static func updating(note: String, metadata: ContactMetadata) -> String { var base = note if let range = metadataBlockRange(in: note) { base.removeSubrange(range) } base = base.trimmingCharacters(in: .whitespacesAndNewlines) guard metadata.hasAnyValue else { return base } var lines: [String] = [] lines.append(startMarker) if metadata.isFavorite { lines.append("favorite=1") } if metadata.isMyCard { lines.append("my_card=1") } lines.append(endMarker) let block = lines.joined(separator: "\n") if base.isEmpty { return block } return base + "\n\n" + block } private static func metadataBlockRange(in note: String) -> Range? { guard let start = note.range(of: startMarker), let end = note.range(of: endMarker, range: start.upperBound..