import 'dart:ffi'; import 'dart:io'; import 'package:logger/logger.dart'; import 'package:path/path.dart' as p; import 'platform_adapter.dart'; class NativeLibraryLoader { NativeLibraryLoader({ required this.logger, PlatformAdapter? adapter, }) : _adapter = adapter ?? const PlatformAdapter(); final Logger logger; final PlatformAdapter _adapter; DynamicLibrary load() { final overridePath = Platform.environment['PEYA_WALLET_LIB'] ?? Platform.environment['SALVIUM_WALLET_LIB']; if (overridePath != null && overridePath.isNotEmpty) { return _loadFromPath(overridePath); } for (final root in _adapter.librarySearchPaths()) { for (final libName in _adapter.libraryNames()) { final candidate = p.join(Directory.current.path, root, libName); if (File(candidate).existsSync()) { logger.i('Loading wallet library from $candidate'); return DynamicLibrary.open(candidate); } } } logger.w('Wallet library not found in search paths. Falling back.'); throw StateError('Wallet library not found. Set PEYA_WALLET_LIB or build native wrapper.'); } DynamicLibrary _loadFromPath(String path) { final resolved = p.normalize(path); if (!File(resolved).existsSync()) { throw StateError('Wallet library not found at $resolved'); } logger.i('Loading wallet library from $resolved'); return DynamicLibrary.open(resolved); } }