in Sources/CrashReporter2/LogParser.swift [87:204]
func parser(filePath: String) -> [String: String]? {
guard let content = try? String(contentsOfFile: filePath, encoding: .utf8) else {
return nil
}
let mainBundlePath = Bundle.main.bundlePath
var frameworks = [String]()
var path = (mainBundlePath as NSString).lastPathComponent
frameworks.append(String(path.prefix(upTo: path.range(of: ".")!.lowerBound)))
for bundle in Bundle.allFrameworks {
if bundle.bundlePath.contains(mainBundlePath) {
path = (bundle.bundlePath as NSString).lastPathComponent
frameworks.append(String(path.prefix(upTo: path.range(of: ".")!.lowerBound)))
}
}
let lines = content.components(separatedBy: CharacterSet.newlines)
var blockBuilders = [BlockBuilder]()
var blockBuilder: BlockBuilder?
preState = .notStart
// state = .notStart
for line in lines {
// debug statement
// print("debugggg, line: \(line)")
// begin header info parse
if state == .notStart && line.hasPrefix(LINE_BLOCK_START) {
state = .start
blockBuilder = BlockBuilder(blockName: "basic_info")
parserBasicBlock(blockBuilder: blockBuilder, line: line)
continue
}
// new block will parse
if line == LINE_BLOCK_MODULE_START {
preState = state
state = .blockStart
continue
}
// check should begin new block parse
let shouldPackBlock = checkState(line: line)
if shouldPackBlock {
if let builder = blockBuilder {
builder.pack()
blockBuilders.append(builder)
blockBuilder = nil
}
}
// parse stack block
if inStacktraceParsing {
parserStacktraceBlock(builder: stackBlockBuilder, line: line, frameworks: frameworks)
}
if state == .start {
parserBasicBlock(blockBuilder: blockBuilder, line: line)
continue
}
if state == .blockStart {
blockBuilder = BlockBuilder(blockName: line)
parserBlock(blockBuilder: blockBuilder, line: line)
state = .blockInProgress
continue
}
if state == .blockInProgress {
parserBlock(blockBuilder: blockBuilder, line: line)
continue
}
}
if let stackBlockBuilder = stackBlockBuilder {
blockBuilders.append(stackBlockBuilder)
}
if let blockBuilder = blockBuilder {
blockBuilders.append(blockBuilder)
}
var results = [String: String]()
for block in blockBuilders {
results[block.blockName] = block.content as String
if block.blockName == "exception_category" {
results["catId"] = md5(content: block.content)
}
}
if let errorId = errorId {
results["id"] = errorId
}
if let type = type {
results["sub_type"] = type
}
if let errorFramework = errorFramework {
var summary = [String: String]()
summary["exception"] = type
if let errorReason = errorReason {
summary["reason"] = errorReason
}
summary["code"] = errorFramework
if let jsonData = try? JSONSerialization.data(withJSONObject: summary, options: []) {
if let jsonString = String(data: jsonData, encoding: .utf8) {
results["summary"] = jsonString
}
}
}
return results
}