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 audio;
9pub mod background;
10pub mod camera;
11pub mod device_info;
12pub mod file_picker;
13pub mod haptics;
14pub mod http;
15pub mod image_picker;
16pub mod launch_args;
17pub mod navigation;
18pub mod network_status;
19pub mod notifier;
20#[cfg(not(target_arch = "wasm32"))]
21pub mod peer;
22pub mod purchases;
23pub mod share_sheet;
24pub mod theme;
25pub mod uri_handler;
26pub mod writable_folder;
27
28pub use audio::{
29    clear_platform_audio, default_audio, local_audio, rememberSoundBank, set_platform_audio,
30    AudioBus, AudioClip, AudioError, AudioPlayer, AudioPlayerRef, NoopAudioPlayer, PlaybackParams,
31    ProvideAudio, SoundBank, SoundBankEntry, SoundBankFailure, SoundId, SoundSpec, VoiceId,
32};
33pub use background::{
34    background_activity, clear_platform_background_activity, set_background_active,
35    set_platform_background_activity, BackgroundActivity, BackgroundActivityRef,
36};
37pub use camera::{
38    camera, clear_platform_camera, set_platform_camera, Camera, CameraError, CameraFrame,
39    CameraRef, CameraStill,
40};
41pub use device_info::{
42    clear_platform_device_info, device_info, set_platform_device_info, DeviceInfo, DeviceInfoRef,
43};
44pub use file_picker::{
45    clear_platform_file_picker, default_file_picker, local_file_picker, set_platform_file_picker,
46    FileFilter, FilePicker, FilePickerError, FilePickerOptions, FilePickerRef, FolderStream,
47    FolderStreamRef, PickedEntry, PickedEntryRef, PickedKind, PickerFuture, ProvideFilePicker,
48    ResumedPick, SaveFileRequest,
49};
50pub use haptics::{
51    clear_platform_haptics, default_haptics, local_haptics, set_platform_haptics, HapticEffect,
52    HapticError, HapticFeedback, HapticPattern, Haptics, HapticsRef, ProvideHaptics,
53};
54pub use http::{
55    default_http_client, local_http_client, map_ordered_concurrent, HttpClient, HttpClientRef,
56    HttpError, HttpFuture,
57};
58pub use image_picker::{
59    clear_platform_image_picker, default_image_picker, local_image_picker,
60    set_platform_image_picker, ImagePicker, ImagePickerError, ImagePickerRef, ImageSource,
61    ProvideImagePicker, IMAGE_EXTENSIONS,
62};
63pub use launch_args::{
64    clear_platform_launch_args, isDebuggable, is_debuggable, launch_args,
65    launch_args_from_command_line, local_launch_args, set_platform_launch_args, LaunchArgValue,
66    LaunchArgs, LaunchArgsRef, ProvideLaunchArgs,
67};
68pub use navigation::{
69    back_interception_enabled, push_back_request, set_back_interception, set_back_request_listener,
70    take_back_requests,
71};
72pub use network_status::{
73    clear_platform_network_monitor, network_monitor, network_status, set_platform_network_monitor,
74    NetworkMonitor, NetworkMonitorRef, NetworkStatus,
75};
76pub use notifier::{
77    clear_platform_notifier, default_notifier, local_notifier, push_notification_deeplink,
78    set_platform_notifier, take_notification_deeplink, Notifier, NotifierRef, NotifyRequest,
79    ProvideNotifier,
80};
81#[cfg(not(target_arch = "wasm32"))]
82pub use peer::{
83    content_length, fetch_range, fetch_to_writer, ByteSource, BytesSource, FetchResult, PeerError,
84    PeerServer, SourceResolver,
85};
86pub use purchases::{
87    clear_platform_purchases, purchases, set_platform_purchases, store_available, store_state,
88    Product, PurchaseEvent, Purchases, PurchasesRef, StorePhase, StoreState,
89};
90pub use share_sheet::{
91    clear_platform_share_sheet, default_share_sheet, local_share_sheet, set_platform_share_sheet,
92    ProvideShareSheet, ShareContent, ShareError, ShareSheet, ShareSheetRef,
93};
94pub use theme::{
95    clear_platform_system_theme, default_system_theme, isSystemInDarkTheme, local_system_theme,
96    set_platform_system_theme, ProvideSystemTheme, SystemTheme,
97};
98pub use uri_handler::{
99    clear_platform_uri_handler, default_uri_handler, local_uri_handler, set_platform_uri_handler,
100    ProvideUriHandler, UriHandler, UriHandlerError, UriHandlerRef,
101};
102pub use writable_folder::{
103    clear_platform_writable_folder_picker, open_writable_folder, pick_writable_folder,
104    set_platform_writable_folder_picker, set_writable_folder_store_factory,
105    take_resumed_writable_folder, FolderError, WritableFolderPicker, WritableFolderPickerRef,
106    WritableFolderStore, WritableFolderStoreRef,
107};
108
109/// Convenience alias used in unit tests.
110#[cfg(test)]
111pub(crate) type TestComposition = Composition<MemoryApplier>;
112
113/// Build a composition with a simple in-memory applier and run the provided closure once.
114#[cfg(test)]
115pub(crate) fn run_test_composition(build: impl FnMut()) -> TestComposition {
116    let mut composition = Composition::new(MemoryApplier::new());
117    composition
118        .render(location_key(file!(), line!(), column!()), build)
119        .expect("initial render succeeds");
120    composition
121}