CutBox CLI

Coverage Report

Created: 2024-03-12 03:43

.../Sources/CutBoxCLICore/HistoryManager.swift
Line
Count
Source
1
import Foundation
2
3
struct HistoryManager {
4
    let plist: [String: Any]
5
    let stringKey = "string"
6
    let timestampKey = "timestamp"
7
    let favoriteKey = "favorite"
8
9
23
    init(plist: [String: Any]) {
10
23
        self.plist = plist
11
23
    }
12
13
23
    func loadHistoryEntries() -> [HistoryEntry] {
14
23
        guard let historyDict = plist["historyStore"] as? [[String: Any?]] else {
15
1
            return []
16
22
        }
17
22
18
86
        return historyDict.compactMap { itemAsHistoryEntry($0 as [String: Any]) }
19
23
    }
20
21
86
    func itemAsHistoryEntry(_ item: [String: Any]) -> HistoryEntry? {
22
86
        guard let string: String = item[stringKey] as? String else {
23
20
            return nil
24
66
        }
25
66
26
66
        return HistoryEntry(string: string,
27
66
                            timestamp: item[timestampKey] as? String,
28
66
                            favorite: item[favoriteKey] as? String)
29
86
    }
30
31
21
    func filterEntries(_ entries: [HistoryEntry], params: CommandParams) -> [HistoryEntry] {
32
21
        var filteredEntries = entries
33
21
34
21
        if params.favorites {
35
3
            filteredEntries = filteredEntries.filter { entry in
36
3
                return entry.favorite == "favorite"
37
3
            }
38
21
        }
39
21
40
21
        if params.missingDate {
41
3
            filteredEntries = filteredEntries.filter { entry in
42
3
                return entry.timestamp == nil
43
3
            }
44
21
        }
45
21
46
21
        if let sinceDate = params.sinceDate {
47
12
            filteredEntries = filteredEntries.filter { entry in
48
12
                if entry.timestamp != nil {
49
8
                    return Double(entry.timeIntervalSince1970!) >= sinceDate
50
8
                }
51
4
                return false
52
12
            }
53
21
        }
54
21
55
21
        if let beforeDate = params.beforeDate {
56
8
            filteredEntries = filteredEntries.filter { entry in
57
8
                if entry.timestamp != nil {
58
6
                    return Double(entry.timeIntervalSince1970!) <= beforeDate
59
6
                }
60
2
                return false
61
8
            }
62
21
        }
63
21
64
21
        if let limit = params.limit {
65
2
            filteredEntries = Array(filteredEntries.prefix(limit))
66
21
        }
67
21
68
21
        return filteredEntries
69
21
    }
70
71
21
    func searchEntries(_ entries: [HistoryEntry], params: CommandParams) -> [HistoryEntry] {
72
21
        guard let query = params.query, let searchMode = params.searchMode else {
73
14
            return entries
74
14
        }
75
7
76
21
        return entries.filter { entry in
77
21
            switch searchMode {
78
21
            case .fuzzy:
79
6
                return entry.string.localizedCaseInsensitiveContains(query)
80
21
            case .regex:
81
6
                return regexpMatch(entry.string, query)
82
21
            case .regexi:
83
3
                return regexpMatch(entry.string, query, caseSensitive: false)
84
21
            case .exact:
85
6
                return entry.string.contains(query)
86
21
            }
87
21
        }
88
21
    }
89
}