// 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)) { if (normalized.startsWith('B')) { return ParseResult( type: CodeType.locationTempStorage, value: 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 || type == CodeType.locationTempStorage; } enum CodeType { zongpaiNo, locationNormal, locationTransit, locationTempStorage, invalid, } class ParseResult { final CodeType type; final String value; ParseResult({required this.type, required this.value}); }