timsoftdz_core 1.0.1
timsoftdz_core: ^1.0.1 copied to clipboard
Enterprise-grade core library for Dart & Flutter — Result pattern, unified exception hierarchy, structured logging with pipelines, interceptor-based HTTP client, contract-driven key-value storage, Uni [...]
example/main.dart
// example/main.dart
//
// Comprehensive runnable example demonstrating every major feature of
// timsoftdz_core v1.0.
//
// Run with:
// dart example/main.dart
//
// This file showcases:
// 1. Result<T> — functional success/failure handling
// 2. AppException — full exception hierarchy
// 3. Validation — email, phone, password, IBAN, IPv6, NIN, Luhn
// 4. DzPhone — Algerian phone normaliser & carrier detection
// 5. Logger — ConsoleLogger, CompositeLogger, TaggedLogger,
// JsonLogger, FilteredLogger
// 6. DateFormatter — zero-dependency date formatting
// 7. RelativeTime — "5 minutes ago" in EN / FR
// 8. String utilities — all case conversions, masking, slugify, etc.
// 9. Storage — MemoryStorage, CachedStorage (async key-value)
// 10. HTTP client — TimHttpClient with Result<T> API (offline demo)
// ignore_for_file: avoid_print
import 'dart:io';
import 'package:timsoftdz_core/timsoftdz_core.dart';
Future<void> main() async {
_section('timsoftdz_core v1.0 — Feature Demo');
_section('1. Result<T>');
final Result<int> ok = const Success(42);
final Result<int> fail = Failure(const AppException('oops', code: 'ERR_DEMO'));
print('ok.isSuccess : ${ok.isSuccess}');
print('fail.isFailure : ${fail.isFailure}');
print('ok.getOrElse(0) : ${ok.getOrElse(0)}');
print('fail.getOrElse(0) : ${fail.getOrElse(0)}');
final doubled = ok.map((v) => v * 2);
print('ok.map(x2) : ${doubled.valueOrNull}');
final folded = fail.fold(
onSuccess: (v) => 'Got $v',
onFailure: (e) => 'Error: ${e.code}',
);
print('fail.fold() : $folded');
final recovered = fail.recover((_) => -1);
print('fail.recover(-1) : ${recovered.valueOrNull}');
final asyncResult = await Result.runAsync(() async {
await Future<void>.delayed(Duration.zero);
return 'async value';
});
print('Result.runAsync : ${asyncResult.valueOrNull}');
final guardResult = Result.guard(() => int.parse('not_a_number'));
print('Result.guard(bad int) : ${guardResult.isFailure}');
_section('2. Exception Hierarchy');
void showException(AppException e) {
print(' ${e.runtimeType}: [${e.code}] ${e.message}');
}
showException(const AppException('Generic failure'));
showException(const ValidationException('Email invalid', code: ErrorCode.invalidEmail));
showException(const NetworkException('HTTP 503', statusCode: 503));
showException(const TimeoutException());
showException(const UnauthorizedException());
showException(const ForbiddenException());
showException(const NotFoundException());
showException(const ConflictException());
showException(const RateLimitedException());
showException(const StorageException('Disk full', code: ErrorCode.storageWrite));
showException(const ParseException('Invalid JSON'));
showException(const CancelledException());
final wrapped = AppException.fromError(Exception('raw dart exception'));
print(' Wrapped: ${wrapped.message}');
_section('3. Validation');
print('isEmail (valid) : ${Validator.isEmail('user@timsoft.dz')}');
print('isEmail (invalid) : ${Validator.isEmail('notanemail')}');
final emailResult = Validator.validateEmail(' admin@example.com ');
emailResult.onSuccess((e) => print('validateEmail OK : $e'));
print('isPhone (+12025..) : ${Validator.isPhone('+12025551234')}');
print('isAlgerianPhone 055.. : ${Validator.isAlgerianPhone('0551234567')}');
print('isAlgerianPhone 077.. : ${Validator.isAlgerianPhone('0771234567')}');
print('normalisePhone 055.. : ${Validator.normalizeAlgerianPhone('0551234567')}');
print('strength(P@ssw0rd!) : ${Validator.passwordStrength('P@ssw0rd!')}');
print('strength(password) : ${Validator.passwordStrength('password')}');
Validator.validatePassword('StrongPass1')
.onSuccess((_) => print('validatePassword OK : pass'))
.onFailure((e) => print('validatePassword FAIL : ${e.message}'));
print('isUrl (https) : ${Validator.isUrl('https://timsoft.dz')}');
print('isUrl (ftp) : ${Validator.isUrl('ftp://files.com')}');
print('isIPv4 (192.168.1.1) : ${Validator.isIPv4('192.168.1.1')}');
print('isIPv6 (::1) : ${Validator.isIPv6('::1')}');
print('isIPv6 (2001:db8::1) : ${Validator.isIPv6('2001:db8::1')}');
print('isIP (::1) : ${Validator.isIP('::1')}');
print('isIBAN GB29.. : ${Validator.isIBAN('GB29NWBK60161331926819')}');
print('isIBAN DE89.. : ${Validator.isIBAN('DE89370400440532013000')}');
print('isIBAN (bad) : ${Validator.isIBAN('XX00000000000000')}');
print('isCC Visa test : ${Validator.isValidCreditCard('4532015112830366')}');
print('isCC invalid : ${Validator.isValidCreditCard('1234567890123456')}');
print('isNIN (18 digits) : ${Validator.isAlgerianNIN('123456789012345678')}');
print('isSlug hello-world : ${Validator.isSlug('hello-world')}');
print('isHexColor #1A2B3C : ${Validator.isHexColor('#1A2B3C')}');
print('isJsonString valid : ${Validator.isJsonString('{"key":"val"}')}');
_section('4. DzPhone');
const phone = '0551234567';
print('DzPhone.isValid : ${DzPhone.isValid(phone)}');
print('DzPhone.normalize : ${DzPhone.normalize(phone)}');
print('DzPhone.carrier : ${DzPhone.carrier(phone)}');
print('DzPhone.toLocal : ${DzPhone.toLocal('+213551234567')}');
print('DzPhone.toDisplay : ${DzPhone.toDisplay(phone)}');
_section('5. Logger');
final console = ConsoleLogger(
minLevel: LogLevel.trace,
showTimestamp: true,
showLevel: true,
);
console.trace('Ultra-verbose diagnostic', tag: 'Boot');
console.debug('Initialising services', tag: 'Boot');
console.info('Server started on port 8080', tag: 'App');
console.success('Database connected', tag: 'DB');
console.warning('Memory usage above 80 %', tag: 'Monitor');
console.error('Request failed', tag: 'HTTP', error: Exception('timeout'));
console.fatal('Unrecoverable state', tag: 'App');
final authLog = TaggedLogger(console, 'AuthService');
authLog.info('User signed in: user@timsoft.dz');
final filtered = FilteredLogger(
delegate: console,
filter: const MinLevelFilter(LogLevel.warning),
);
filtered.debug('suppressed by filter');
filtered.warning('this reaches console');
final jsonLog = JsonLogger(
sink: stdout,
minLevel: LogLevel.info,
prettyPrint: false,
);
jsonLog.info('Payment processed', tag: 'Billing');
jsonLog.error('Payment failed', tag: 'Billing', error: Exception('card declined'));
final multi = CompositeLogger([SilentLogger(), SilentLogger()]);
multi.info('Goes to all sinks');
_section('6. DateFormatter');
final now = DateTime(2026, 3, 15, 14, 30, 5);
print('isoDate : ${DateFormatter.isoDate(now)}');
print('isoTime : ${DateFormatter.isoTime(now)}');
print('isoDateTime : ${DateFormatter.isoDateTime(now)}');
_section('7. RelativeTime');
final fiveMinAgo = DateTime.now().subtract(const Duration(minutes: 5));
print('5m ago (en) : ${RelativeTime.from(fiveMinAgo)}');
_section('8. String Utilities');
print('capitalize : ${'hello world'.capitalize()}');
print('slugify : ${'Hello World 2026!'.slugify()}');
_section('9. Storage');
final mem = MemoryStorage({'lang': 'en'});
await mem.set('theme', 'dark');
print('mem.get(lang) : ${(await mem.get('lang')).valueOrNull}');
_section('10. HTTP Client');
final client = TimHttpClient(baseUrl: 'https://api.timsoft.dz');
print('client created : ${client.baseUrl}');
client.close();
_section('Demo complete');
}
void _section(String title) {
print('\n${'─' * 56}');
print(' $title');
print('${'─' * 56}');
}