Last active
February 21, 2020 15:11
-
-
Save nuclearace/4ae79d43465229098d721845bfeaf366 to your computer and use it in GitHub Desktop.
Simple DB
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
struct DatabaseEntry: Codable { | |
let desc: String | |
let category: String | |
let added: Date | |
let data: [String: String] | |
} | |
extension DatabaseEntry: CustomStringConvertible { | |
var description: String { | |
return "\(category) \(added) | \(desc); \(data)" | |
} | |
} | |
class Database: Codable { | |
private var values = [DatabaseEntry]() | |
func addFromArgs(_ args: ArraySlice<String>) { | |
guard args.count >= 2 else { | |
fatalError("Must give a description and category when adding") | |
} | |
var data = [String: String]() | |
var idx = args.index(2, offsetBy: 1, limitedBy: args.endIndex) | |
while let i = idx, let valIdx = args.index(i, offsetBy: 1, limitedBy: args.endIndex), valIdx != args.endIndex { | |
let field = args[i] | |
let val = args[valIdx] | |
data[field] = val | |
idx = args.index(valIdx, offsetBy: 1, limitedBy: args.endIndex) | |
} | |
values.append(DatabaseEntry(desc: args[1], category: args[2], added: Date(), data: data)) | |
} | |
func printAll() { | |
for item in values.sorted(by: { $0.added < $1.added }) { | |
print(item) | |
} | |
} | |
func printLatest() { | |
guard let last = values.last else { | |
return | |
} | |
print(last) | |
} | |
func printLatestInCategories() { | |
var seenCats = Set<String>() | |
for thing in values.sorted(by: { $0.added > $1.added }) where !seenCats.contains(thing.category) { | |
print(thing) | |
seenCats.insert(thing.category) | |
} | |
} | |
} | |
let args = Array(CommandLine.arguments.dropFirst()) | |
guard !args.isEmpty else { | |
fatalError("Must give at least one command") | |
} | |
let manager = FileManager.default | |
let dbLoc = "\(manager.currentDirectoryPath)/db.json" | |
let dec = JSONDecoder() | |
let enc = JSONEncoder() | |
let db: Database | |
if let dbFile = manager.contents(atPath: dbLoc) { | |
db = try dec.decode(Database.self, from: dbFile) | |
} else { | |
db = Database() | |
} | |
switch args[0] { | |
case "add": | |
db.addFromArgs(args.dropFirst()) | |
manager.createFile(atPath: dbLoc, contents: try enc.encode(db)) | |
case "all": | |
db.printAll() | |
case "last": | |
db.printLatest() | |
case "categories": | |
db.printLatestInCategories() | |
case _: | |
fatalError("") | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment