forked from sbarex/SourceCodeSyntaxHighlight
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.swift
More file actions
98 lines (85 loc) · 2.54 KB
/
Copy pathmain.swift
File metadata and controls
98 lines (85 loc) · 2.54 KB
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
//
// main.swift
// settings_chk
//
// Created by Sbarex on 20/06/25.
// Copyright © 2025 sbarex. All rights reserved.
//
import Foundation
import Yams
func usage() {
let executablePath = CommandLine.arguments[0]
let executableName = URL(fileURLWithPath: executablePath).lastPathComponent
print("Usage: \(executableName) settings.yaml")
print("Check the validity of the settings.yaml file (must be a valid yaml, decodable as [String: [String: [String: String]]], with the UTIs and extesions root keys.")
print("")
}
guard CommandLine.arguments.count == 2, !CommandLine.arguments[1].isEmpty else {
print(CommandLine.arguments.count)
usage()
exit(1)
}
let filename = CommandLine.arguments[1]
guard FileManager.default.fileExists(atPath: filename) else {
print("Error: \(filename) not found!")
exit(2)
}
let data: String
if #available(macOS 13.0, *) {
var enc: String.Encoding = .utf8
guard let _data = try? String(contentsOf: URL(filePath: filename), usedEncoding: &enc) else {
print("Error: unable to read \(filename)!")
exit(3)
}
data = _data
} else {
guard let _data = try? String(contentsOf: URL(fileURLWithPath: filename)) else {
print("Error: unable to read \(filename)!")
exit(3)
}
data = _data
}
let raw_d: Any
do {
guard let d = try Yams.load(yaml: data) else {
print("Error: \(filename) is not a valid yaml file!")
exit(4)
}
raw_d = d
} catch {
print("Error: \(filename) is not a valid yaml file: \(error)!")
exit(4)
}
let global_nodes = ["UTIs", "extensions"]
if let a = raw_d as? [String: [String: [String: String]]] {
for node in global_nodes {
guard let _ = a[node] else {
print("Error: missing \(node) root key on \(filename)!")
exit(5)
}
}
print("\(filename) is valid.")
exit(0)
}
print("Error: \(filename) is not a valid settings file!")
if let a = raw_d as? [String: Any] {
for node_name in global_nodes {
guard let node = a[node_name] else {
print("Missing \(node_name) root key on \(filename)!")
exit(5)
}
if let node = node as? [String: Any] {
for d in node {
guard let _ = d.value as? [String: String] else {
print("\(node_name)/\(d.key): is not a [String: String]!")
exit(6)
}
}
} else {
print("\(node) is not a [String: String]!")
exit(6)
}
}
}
print(raw_d)
exit(6)