// lib/services/code_parser.dart class CodeParser { static final _zongpaiRegex = RegExp( r'^\d{2}(B|C|T)\d+$|^\d{2}(BW|CW)\d{4}$', ); static final _locationRegex = RegExp( r'^[A-Z0-9]+-[A-Z0-9]+-[A-Z0-9]+$', ); static final _transitRegex = RegExp( r'^TRANS-', ); static ParseResult parse(String code) { final trimmed = code.trim(); if (trimmed.isEmpty) { return ParseResult(type: CodeType.invalid, value: code); } final normalized = trimmed.toUpperCase(); if (_transitRegex.hasMatch(normalized)) { return ParseResult(type: CodeType.locationTransit, value: normalized); } if (_zongpaiRegex.hasMatch(normalized)) { return ParseResult(type: CodeType.zongpaiNo, value: normalized); } if (_locationRegex.hasMatch(normalized)) { return ParseResult(type: CodeType.locationNormal, value: normalized); } return ParseResult(type: CodeType.invalid, value: code); } static bool isLocation(CodeType type) => type == CodeType.locationNormal || type == CodeType.locationTransit; } enum CodeType { zongpaiNo, locationNormal, locationTransit, invalid } class ParseResult { final CodeType type; final String value; ParseResult({required this.type, required this.value}); }