func parser()

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
    }