1#![doc = include_str!("../README.md")]
2
3#[cfg(test)]
4use cranpose_core::{Composition, MemoryApplier, location_key};
5
6pub mod accessibility_options;
7pub mod accessibility_state;
8pub mod app_info;
9pub mod app_update;
10pub mod async_io;
11pub mod audio;
12pub mod background;
13pub mod bundled_assets;
14pub mod camera;
15mod composition_locals;
16pub mod content;
17pub mod device_info;
18pub mod file_picker;
19#[cfg(not(target_arch = "wasm32"))]
20pub mod github_release_updater;
21pub mod haptics;
22#[cfg(not(target_arch = "wasm32"))]
23mod helper_process;
24pub mod host;
25pub mod host_messages;
26pub mod host_surface;
27pub mod http;
28pub mod image_picker;
29pub mod incoming_share;
30pub mod launch_args;
31pub mod launcher;
32pub mod media;
33pub mod memory_pressure;
34pub mod navigation;
35pub mod network_status;
36pub mod notifier;
37#[cfg(not(target_arch = "wasm32"))]
38pub mod peer;
39pub mod power;
40pub mod preferences;
41pub mod purchases;
42mod registry;
43pub mod share_sheet;
44pub mod theme;
45pub mod uri_handler;
46pub mod writable_folder;
47
48pub use accessibility_options::{
49 AccessibilityOptions, ProvideAccessibilityOptions, local_accessibility_options,
50 platform_accessibility_options, set_platform_accessibility_options,
51};
52pub use accessibility_state::{
53 AccessibilityState, ProvideAccessibilityState, local_accessibility_state,
54 platform_accessibility_state, set_platform_accessibility_state,
55};
56pub use app_info::{
57 AppInfo, AppInfoRef, app_info, build_version, clear_platform_app_info, set_platform_app_info,
58 version_name,
59};
60pub use app_update::{
61 AppUpdateCapabilities, AppUpdateError, AppUpdateObserver, AppUpdateStatus, AppUpdater,
62 AppUpdaterRef, DigestAlgorithm, DigestVerifier, GitHubReleaseUpdate, PackageDigest,
63 UpdatePackage, app_update_capabilities, app_update_checks_supported, app_update_status,
64 app_updates_supported, check_for_app_update, clear_platform_app_updater, install_app_update,
65 observe_app_update_status, set_app_update_status, set_platform_app_updater, sha256_hex,
66 verify_package,
67};
68pub use async_io::{ChunkChannel, ChunkNext, ChunkStream, MAX_PENDING_CHUNKS, Signal, SignalWait};
69pub use audio::{
70 AudioBus, AudioClip, AudioError, AudioPlayer, AudioPlayerRef, NoopAudioPlayer, PlaybackParams,
71 ProvideAudio, SoundBank, SoundBankEntry, SoundBankFailure, SoundId, SoundSpec, VoiceId,
72 clear_platform_audio, default_audio, local_audio, rememberSoundBank, set_platform_audio,
73};
74pub use background::{
75 BackgroundActivity, BackgroundActivityRef, BackgroundWorkLease, acquire_background_work,
76 background_active, background_activity, clear_platform_background_activity,
77 set_platform_background_activity,
78};
79#[cfg(not(target_arch = "wasm32"))]
80pub use bundled_assets::{
81 BundledAssetEntry, BundledAssetInstallOutcome, BundledAssetInstallSpec,
82 install_bundled_asset_set,
83};
84pub use bundled_assets::{
85 BundledAssetError, BundledAssetReader, BundledAssets, BundledAssetsRef, StreamingAssetReader,
86 bundled_assets, clear_platform_bundled_assets, set_platform_bundled_assets,
87};
88pub use camera::{
89 Camera, CameraError, CameraFrame, CameraLens, CameraLenses, CameraObserver, CameraRef,
90 CameraState, CameraStill, FlashMode, FrameFormat, LensFacing, UprightRgba, camera,
91 camera_lenses, camera_state, camera_supported, capture_camera_still, clear_platform_camera,
92 dropped_camera_frames, latest_camera_frame, observe_camera_frames, observe_camera_lenses,
93 observe_camera_state, observe_camera_stills, publish_camera_frame, publish_camera_lenses,
94 publish_camera_state, publish_camera_still, record_dropped_camera_frame, rememberCameraFrames,
95 rememberCameraLenses, rememberCameraState, rememberCameraStills, request_camera_still,
96 set_platform_camera, start_camera, stop_camera,
97};
98pub use content::{
99 BytesContent, Content, ContentChannel, ContentEntry, ContentError, ContentFolder,
100 ContentFolderRef, ContentFuture, ContentHandle, ContentMetadata, ContentReader,
101 ContentReaderRef, ContentResolver, ContentResolverRef, ContentSink, ContentSinkRef,
102 ContentStream, ContentStreamRef, DEFAULT_CHUNK_LEN, ReadyFolder,
103 clear_platform_content_resolver, collect_stream, drain_reader, folder_files, percent_decode,
104 percent_decode_lossy, resolve_content, set_platform_content_resolver, write_all,
105};
106#[cfg(not(target_arch = "wasm32"))]
107pub use content::{FileContent, FileFolder, FileSink, file_content, file_folder};
108pub use device_info::{
109 DeviceInfo, DeviceInfoRef, clear_platform_device_info, device_info, release_free_memory,
110 set_platform_device_info,
111};
112pub use file_picker::{
113 FileFilter, FilePicker, FilePickerError, FilePickerOptions, FilePickerRef, PickerFuture,
114 ProvideFilePicker, RecoveredPick, SaveDocumentRequest, clear_platform_file_picker,
115 default_file_picker, local_file_picker, set_platform_file_picker,
116};
117#[cfg(not(target_arch = "wasm32"))]
118pub use github_release_updater::GitHubAppUpdater;
119pub use haptics::{
120 HapticEffect, HapticError, HapticFeedback, HapticPattern, Haptics, HapticsRef, ProvideHaptics,
121 clear_platform_haptics, default_haptics, local_haptics, set_platform_haptics,
122};
123#[cfg(not(target_arch = "wasm32"))]
124pub use helper_process::windowless_command;
125pub use host::{
126 DEFAULT_DURABLE_SAVE_DEADLINE, DurableSaveEffect, DurableSaveOutcome, DurableSaveRegistration,
127 HostController, HostControllerRef, LifecycleEvent, LifecycleObserver, LifecycleState,
128 PlatformDirectories, PlatformDirectoryError, ProvideLifecycle, advance_lifecycle,
129 application_directories, application_id, background_app, clear_application_id,
130 clear_host_controller, current_lifecycle_state, dispatch_lifecycle, dispatch_lifecycle_state,
131 exit_app, host_controller, local_lifecycle_state, observe_lifecycle, register_durable_save,
132 rememberLifecycleEvents, rememberLifecycleState, set_application_id, set_host_controller,
133 set_keep_screen_on, window_lifecycle_state,
134};
135#[cfg(not(target_arch = "wasm32"))]
136pub use host::{durable_save_deadline, run_durable_saves};
137pub use host_messages::{
138 HostMessage, HostMessageObserver, clear_host_messages, clear_host_outbox, install_host_outbox,
139 observe_host_messages, publish_host_message, rememberHostMessages, send_to_host,
140};
141pub use host_surface::{
142 HostSurface, HostSurfaceObserver, HostSurfaceRef, HostSurfaceSize, ResizeRefused,
143 clear_platform_host_surface, host_surface, host_surface_size, observe_host_surface_size,
144 publish_host_surface_size, rememberHostSurfaceSize, request_host_surface_size,
145 set_platform_host_surface,
146};
147pub use http::{
148 BytesBody, HttpBody, HttpBodyRef, HttpClient, HttpClientRef, HttpControl, HttpError,
149 HttpFuture, HttpMethod, HttpProgress, HttpRequest, HttpResponse, ProgressHandler, StubAnswer,
150 StubHttpClient, default_http_client, http_body_ref, local_http_client, map_ordered_concurrent,
151};
152pub use image_picker::{
153 IMAGE_EXTENSIONS, ImagePicker, ImagePickerError, ImagePickerRef, ImageSource,
154 ProvideImagePicker, clear_platform_image_picker, default_image_picker, local_image_picker,
155 set_platform_image_picker,
156};
157pub use incoming_share::{
158 IncomingContent, IncomingContentObserver, IncomingSource, clear_incoming_content,
159 observe_incoming_content, publish_incoming_content, rememberIncomingContent,
160};
161pub use launch_args::{
162 LaunchArgValue, LaunchArgs, LaunchArgsRef, ProvideLaunchArgs, clear_platform_launch_args,
163 is_debuggable, isDebuggable, launch_args, launch_args_from_command_line, local_launch_args,
164 set_platform_launch_args,
165};
166pub use launcher::{
167 LauncherResult, OpenFileLauncher, OpenFilesLauncher, OpenFolderLauncher, SaveDocumentLauncher,
168 WritableFolderLauncher, clear_launcher_state, rememberOpenFileLauncher,
169 rememberOpenFilesLauncher, rememberOpenFolderLauncher, rememberSaveDocumentLauncher,
170 rememberWritableFolderLauncher,
171};
172pub use media::{
173 AudioFocus, DUCKED_GAIN, EqualizerBand, EqualizerSettings, MediaArtwork, MediaCapabilities,
174 MediaCommand, MediaError, MediaItem, MediaMetadata, MediaObserver, MediaPlayer, MediaPlayerRef,
175 MediaSamples, MediaSourceHandle, MediaSourceOpener, MediaSourceOpenerRef,
176 OCTAVE_BAND_CENTERS_HZ, PlaybackProgress, PlaybackState, audio_focus,
177 clear_platform_media_player, clear_platform_media_source_opener, current_media_item,
178 dropped_media_samples, latest_media_samples, media_capabilities, media_equalizer,
179 media_equalizer_bands, media_playback_supported, media_player, media_volume,
180 observe_audio_focus, observe_media_commands, observe_media_samples, observe_playback_progress,
181 observe_playback_state, octave_equalizer_bands, open_media, open_media_source, path_from_uri,
182 pause_media, play_media, playback_progress, playback_state, probe_media_duration,
183 publish_audio_focus, publish_media_command, publish_media_samples, publish_playback_progress,
184 publish_playback_state, record_dropped_media_samples, rememberAudioFocus,
185 rememberMediaCommands, rememberMediaSamples, rememberPlaybackProgress, rememberPlaybackState,
186 seek_media, seek_media_fraction, set_media_analysis_enabled, set_media_balance,
187 set_media_equalizer, set_media_looping, set_media_metadata, set_media_speed, set_media_volume,
188 set_platform_media_player, set_platform_media_source_opener, stop_media, toggle_media,
189 uri_for_path,
190};
191pub use memory_pressure::{
192 MemoryPressure, MemoryPressureObserver, observe_memory_pressure, publish_memory_pressure,
193 rememberMemoryPressure,
194};
195pub use navigation::{
196 BackHandler, BackRequestObserver, back_interception_enabled, exit_requested,
197 observe_back_requests, push_back_request, request_exit, set_back_interception,
198 take_back_requests, take_exit_request,
199};
200pub use network_status::{
201 NetworkMonitor, NetworkMonitorRef, NetworkStatus, clear_platform_network_monitor,
202 network_monitor, network_status, set_platform_network_monitor,
203};
204pub use notifier::{
205 Notifier, NotifierRef, NotifyRequest, ProvideNotifier, clear_platform_notifier,
206 default_notifier, local_notifier, push_notification_deeplink, set_platform_notifier,
207 take_notification_deeplink,
208};
209#[cfg(not(target_arch = "wasm32"))]
210pub use peer::{
211 ByteSource, BytesSource, FetchResult, PeerError, PeerServer, SourceResolver, content_length,
212 fetch_range, fetch_to_writer,
213};
214pub use power::{
215 BatteryStatus, PowerCapabilities, PowerMonitor, PowerMonitorRef, PowerObserverRegistration,
216 PowerReading, PowerState, ThermalState, clear_platform_power_monitor, observe_power_state,
217 power_capabilities, power_monitor, power_state, publish_power_state, rememberPowerState,
218 set_platform_power_monitor,
219};
220#[cfg(all(target_arch = "wasm32", feature = "preferences-web"))]
221pub use preferences::BrowserPreferences;
222#[cfg(not(target_arch = "wasm32"))]
223pub use preferences::FilePreferences;
224pub use preferences::{
225 MemoryPreferences, PreferencesError, PreferencesRef, PreferencesStore, Saver,
226 clear_platform_preferences, preferences, rememberSaveable, set_platform_preferences,
227};
228pub use purchases::{
229 Product, PurchaseEvent, Purchases, PurchasesRef, StoreObserver, StorePhase, StoreState,
230 clear_platform_purchases, note_store_news, observe_store_news, purchases,
231 rememberPurchaseEvents, rememberStoreState, set_platform_purchases, store_available,
232 store_state,
233};
234pub use share_sheet::{
235 ProvideShareSheet, ShareContent, ShareError, ShareSheet, ShareSheetRef,
236 clear_platform_share_sheet, default_share_sheet, local_share_sheet, set_platform_share_sheet,
237};
238pub use theme::{
239 ProvideSystemTheme, SystemTheme, clear_platform_system_theme, default_system_theme,
240 isSystemInDarkTheme, local_system_theme, set_platform_system_theme,
241};
242pub use uri_handler::{
243 ProvideUriHandler, UriHandler, UriHandlerError, UriHandlerRef, clear_platform_uri_handler,
244 default_uri_handler, local_uri_handler, set_platform_uri_handler,
245};
246pub use writable_folder::{
247 FolderEntry, FolderError, FolderReader, FolderWriter, WritableFolderStore,
248 WritableFolderStoreRef, open_writable_folder, set_writable_folder_store_factory,
249};
250
251#[cfg(test)]
252pub(crate) type TestComposition = Composition<MemoryApplier>;
253
254#[cfg(test)]
255pub(crate) fn test_scratch_dir(tag: &str) -> std::path::PathBuf {
256 cranpose_core::test_scratch_dir(env!("CARGO_MANIFEST_DIR"), tag)
257}
258
259#[cfg(test)]
260pub(crate) fn run_test_composition(build: impl FnMut()) -> TestComposition {
261 let mut composition = Composition::new(MemoryApplier::new());
262 composition
263 .render(location_key(file!(), line!(), column!()), build)
264 .expect("initial render succeeds");
265 composition
266}
267
268#[cfg(test)]
271pub(crate) fn captured_in_composition<T: Copy + 'static>(
272 read: impl Fn() -> T + 'static,
273) -> Option<T> {
274 let captured = std::rc::Rc::new(std::cell::Cell::new(None));
275 let sink = std::rc::Rc::clone(&captured);
276 run_test_composition(move || sink.set(Some(read())));
277 captured.get()
278}