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