/// Parses a component with its coordinates. func parseComponent(_ bytes: T, _ start: Int, _ end: Int) -> Component? where T.Element == UInt8, T.Index == Int { guard let (label, parenthesisIndex) = extractComponentLabel(bytes, start, end) else { return nil } guard let (coordinates, endIndex) = parseCoordinates( bytes, parenthesisIndex + 1, end) else { return nil } let shape = extractComponentShape(bytes, endIndex, end) return Component(label: label, coordinates: coordinates, shape: shape) } /// Looks for a component label by taking the string before the first open /// parenthesis. @inline(__always) private func extractComponentLabel(_ bytes: T, _ start: Int, _ end: Int) -> ( String, Int )? where T.Element == UInt8, T.Index == Int { var index = start while index < end { if bytes[index] == kOpenParenthesis { guard index > start else { return nil } guard let label = extractTrimmedString(bytes, start, index) else { return nil } return (label, index) } index += 1 } return nil } /// Extracts a shape by looking for a shape label in square brackets. /// If missing, incomplete or invalid, it returns a circle @inline(__always) private func extractComponentShape(_ bytes: T, _ start: Int, _ end: Int) -> Shape where T.Element == UInt8, T.Index == Int { var index = skipWhitespace(bytes, end, start) guard index < end && bytes[index] == kOpenSquareBracket else { return .circle } index += 1 let shapeStart = index while index < end && bytes[index] != kCloseSquareBracket { index += 1 } guard index > shapeStart && index < end else { return .circle } let shapeName = bytes[shapeStart..(_ shapeName: T) -> Shape where T.Element == UInt8, T.Index == Int { var trimStart = shapeName.startIndex var trimEnd = shapeName.endIndex trimStart = skipWhitespace(shapeName, trimEnd, trimStart) trimEnd = shaveWhitespace(shapeName, trimStart, trimEnd) let trimmedName = shapeName[trimStart..