Skip to main content

cranpose_services/
lib.rs

1//! Multiplatform service abstractions used by Cranpose applications.
2
3#![deny(unsafe_code)]
4
5#[cfg(test)]
6use cranpose_core::{location_key, Composition, MemoryApplier};
7
8pub mod background;
9pub mod camera;
10pub mod device_info;
11pub mod file_picker;
12pub mod haptics;
13pub mod http;
14pub mod image_picker;
15pub mod navigation;
16pub mod network_status;
17pub mod notifier;
18#[cfg(not(target_arch = "wasm32"))]
19pub mod peer;
20pub mod share_sheet;
21pub mod theme;
22pub mod uri_handler;
23pub mod writable_folder;
24
25pub use background::{
26    background_activity, clear_platform_background_activity, set_background_active,
27    set_platform_background_activity, BackgroundActivity, BackgroundActivityRef,
28};
29pub use camera::{
30    camera, clear_platform_camera, set_platform_camera, Camera, CameraError, CameraFrame,
31    CameraRef, CameraStill,
32};
33pub use device_info::{
34    clear_platform_device_info, device_info, set_platform_device_info, DeviceInfo, DeviceInfoRef,
35};
36pub use file_picker::{
37    clear_platform_file_picker, default_file_picker, local_file_picker, set_platform_file_picker,
38    FileFilter, FilePicker, FilePickerError, FilePickerOptions, FilePickerRef, FolderStream,
39    FolderStreamRef, PickedEntry, PickedEntryRef, PickedKind, PickerFuture, ProvideFilePicker,
40    ResumedPick, SaveFileRequest,
41};
42pub use haptics::{
43    clear_platform_haptics, default_haptics, local_haptics, set_platform_haptics, HapticFeedback,
44    Haptics, HapticsRef, ProvideHaptics,
45};
46pub use http::{
47    default_http_client, local_http_client, map_ordered_concurrent, HttpClient, HttpClientRef,
48    HttpError, HttpFuture,
49};
50pub use image_picker::{
51    clear_platform_image_picker, default_image_picker, local_image_picker,
52    set_platform_image_picker, ImagePicker, ImagePickerError, ImagePickerRef, ImageSource,
53    ProvideImagePicker, IMAGE_EXTENSIONS,
54};
55pub use navigation::{
56    back_interception_enabled, push_back_request, set_back_interception, take_back_requests,
57};
58pub use network_status::{
59    clear_platform_network_monitor, network_monitor, network_status, set_platform_network_monitor,
60    NetworkMonitor, NetworkMonitorRef, NetworkStatus,
61};
62pub use notifier::{
63    clear_platform_notifier, default_notifier, local_notifier, push_notification_deeplink,
64    set_platform_notifier, take_notification_deeplink, Notifier, NotifierRef, NotifyRequest,
65    ProvideNotifier,
66};
67#[cfg(not(target_arch = "wasm32"))]
68pub use peer::{
69    content_length, fetch_range, fetch_to_writer, ByteSource, BytesSource, FetchResult, PeerError,
70    PeerServer, SourceResolver,
71};
72pub use share_sheet::{
73    clear_platform_share_sheet, default_share_sheet, local_share_sheet, set_platform_share_sheet,
74    ProvideShareSheet, ShareContent, ShareError, ShareSheet, ShareSheetRef,
75};
76pub use theme::{
77    clear_platform_system_theme, default_system_theme, isSystemInDarkTheme, local_system_theme,
78    set_platform_system_theme, ProvideSystemTheme, SystemTheme,
79};
80pub use uri_handler::{
81    clear_platform_uri_handler, default_uri_handler, local_uri_handler, set_platform_uri_handler,
82    ProvideUriHandler, UriHandler, UriHandlerError, UriHandlerRef,
83};
84pub use writable_folder::{
85    clear_platform_writable_folder_picker, open_writable_folder, pick_writable_folder,
86    set_platform_writable_folder_picker, set_writable_folder_store_factory,
87    take_resumed_writable_folder, FolderError, WritableFolderPicker, WritableFolderPickerRef,
88    WritableFolderStore, WritableFolderStoreRef,
89};
90
91/// Convenience alias used in unit tests.
92#[cfg(test)]
93pub(crate) type TestComposition = Composition<MemoryApplier>;
94
95/// Build a composition with a simple in-memory applier and run the provided closure once.
96#[cfg(test)]
97pub(crate) fn run_test_composition(build: impl FnMut()) -> TestComposition {
98    let mut composition = Composition::new(MemoryApplier::new());
99    composition
100        .render(location_key(file!(), line!(), column!()), build)
101        .expect("initial render succeeds");
102    composition
103}