-
Notifications
You must be signed in to change notification settings - Fork 0
/
Types.fs
116 lines (90 loc) · 3.09 KB
/
Types.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
module Types
open System
open System.IO
open System.Text.Json
open Util
let printConfigRow label value newValue =
printfn "%s: %s%s" label value
<| match newValue with
| Some nv when value = nv -> ""
| Some nv -> $" -> %s{nv}"
| None -> ""
type Group =
{ Name: string
Path: string
Glob: option<string> }
module Group =
let defaultGlob = "**/*"
let printUpdated group newName newPath newGlob =
printConfigRow "Name" group.Name newName
printConfigRow "Path" group.Path newPath
match (group.Glob, newGlob) with
| Some _, _
| None, Some _ ->
printConfigRow "Glob" (Option.defaultValue "" group.Glob) newGlob
| _ -> ()
printfn ""
let print group = printUpdated group None None None
let private validNameChars: Set<char> =
[ 'A' .. 'Z' ]
@ [ 'a' .. 'z' ] @ [ '0' .. '9' ] @ [ '-'; '_' ]
|> Set.ofList
let isValidName (name: string) =
String.forall (fun c -> Set.contains c validNameChars) name
type Config =
{ Path: string
Frequency: int
NumToKeep: int
Groups: Group [] }
module Config =
let def =
{ Path =
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)
+/ ".vbu-backups"
Frequency = 15
NumToKeep = 20
Groups = [||] }
let saveDefault path =
printfn
$"Creating new config file at `%s{path}'.\n\
Use the `config' command to update default values, which are:\n\
\n\
Backup path: %s{def.Path}\n\
Backup frequency (in minutes): %d{def.Frequency}\n\
Number of backups to keep: %d{def.NumToKeep}\n"
match Path.GetDirectoryName(path: string) with
| "" -> ()
| path ->
Directory.CreateDirectory(path)
|> ignore<DirectoryInfo>
File.WriteAllText(path, JsonSerializer.Serialize(def))
let printUpdated config newBackupDir newBackupFreq newBackupsToKeep =
printConfigRow "Backup path" config.Path newBackupDir
printConfigRow
"Backup frequency (in minutes)"
(string config.Frequency)
(Option.map string newBackupFreq)
printConfigRow
"Number of backups to keep"
(string config.NumToKeep)
(Option.map string newBackupsToKeep)
printfn ""
let print config = printUpdated config None None None
let load path =
if not (File.Exists(path)) then
saveDefault path
try
path
|> File.ReadAllText
|> JsonSerializer.Deserialize<Config>
with
| e ->
warn
$"Couldn't load config: %s{e.Message}\nAttempting to save default config \
to '%s{path}' after backing up existing config.\n"
if File.Exists(path) then
File.Copy(path, path + ".bak", true)
saveDefault path
def
let save path (config: Config) =
File.WriteAllText(path, JsonSerializer.Serialize(config))