/// 폼 필드 검증 함수 및 유틸리티 (SRP, 재사용성, 테스트 용이성 중심) library; /// 필수 입력값 검증 String? validateRequired(String? value, String fieldName) { if (value == null || value.isEmpty) { return '$fieldName을(를) 입력해주세요'; } return null; } /// 이메일 형식 검증 String? validateEmail(String? value) { if (value == null || value.isEmpty) { return '이메일을 입력해주세요'; } final emailRegex = RegExp( r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', ); if (!emailRegex.hasMatch(value)) { return '유효한 이메일 주소를 입력해주세요'; } return null; } /// 전화번호 형식 검증 (숫자, 하이픈만 허용) String? validatePhoneNumber(String? value) { if (value == null || value.isEmpty) { return null; // 필수 입력 아님 } final phoneRegex = RegExp(r'^[0-9\-]+$'); if (!phoneRegex.hasMatch(value)) { return '전화번호는 숫자와 하이픈(-)만 입력 가능합니다'; } return null; } /// 숫자 검증 String? validateNumber(String? value, String fieldName) { if (value == null || value.isEmpty) { return '$fieldName을(를) 입력해주세요'; } final numberRegex = RegExp(r'^[0-9]+$'); if (!numberRegex.hasMatch(value)) { return '$fieldName은(는) 숫자만 입력 가능합니다'; } return null; } /// 최소 길이 검증 String? validateMinLength(String? value, String fieldName, int minLength) { if (value == null || value.isEmpty) { return '$fieldName을(를) 입력해주세요'; } if (value.length < minLength) { return '$fieldName은(는) 최소 $minLength자 이상이어야 합니다'; } return null; } /// 최대 길이 검증 String? validateMaxLength(String? value, String fieldName, int maxLength) { if (value == null || value.isEmpty) { return null; // 필수 입력 아님 } if (value.length > maxLength) { return '$fieldName은(는) 최대 $maxLength자 이하여야 합니다'; } return null; } /// 시리얼 넘버 검증 (알파벳, 숫자, 하이픈만 허용) String? validateSerialNumber(String? value) { if (value == null || value.isEmpty) { return null; // 필수 입력 아님 } final serialRegex = RegExp(r'^[a-zA-Z0-9\-]+$'); if (!serialRegex.hasMatch(value)) { return '시리얼 번호는 알파벳, 숫자, 하이픈(-)만 입력 가능합니다'; } return null; } /// 바코드 검증 (숫자만 허용) String? validateBarcode(String? value) { if (value == null || value.isEmpty) { return null; // 필수 입력 아님 } final barcodeRegex = RegExp(r'^[0-9]+$'); if (!barcodeRegex.hasMatch(value)) { return '바코드는 숫자만 입력 가능합니다'; } return null; } /// FormValidator: 폼 필드 검증 유틸리티 클래스 class FormValidator { /// 필수 입력 검증 static String? Function(String?) required(String errorMessage) { return (String? value) { if (value == null || value.trim().isEmpty) { return errorMessage; } return null; }; } /// 이메일 형식 검증 static String? Function(String?) email([String? errorMessage]) { return (String? value) { if (value == null || value.isEmpty) { return null; // 빈 값은 허용 } final bool emailValid = RegExp( r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', ).hasMatch(value); if (!emailValid) { return errorMessage ?? '유효한 이메일 주소를 입력하세요'; } return null; }; } /// 전화번호 형식 검증 static String? Function(String?) phone([String? errorMessage]) { return (String? value) { if (value == null || value.isEmpty) { return null; // 빈 값은 허용 } final bool phoneValid = RegExp(r'^[0-9\-\s]+$').hasMatch(value); if (!phoneValid) { return errorMessage ?? '유효한 전화번호를 입력하세요'; } return null; }; } }