Skip to content

Instantly share code, notes, and snippets.

@nuclearace
Last active February 21, 2020 15:11
Show Gist options
  • Save nuclearace/4ae79d43465229098d721845bfeaf366 to your computer and use it in GitHub Desktop.
Save nuclearace/4ae79d43465229098d721845bfeaf366 to your computer and use it in GitHub Desktop.
Simple DB
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