pub struct LAEnvironment { /* private fields */ }Expand description
Managed wrapper around Apple’s LAEnvironment.
Implementations§
Source§impl LAEnvironment
impl LAEnvironment
Sourcepub fn current_user() -> Result<Self>
pub fn current_user() -> Result<Self>
The current user’s authentication environment.
§Errors
Returns an error if the macOS 15 environment APIs are unavailable or the Swift bridge rejects the request.
Examples found in repository?
7fn main() -> Result<(), Box<dyn std::error::Error>> {
8 let environment = match LAEnvironment::current_user() {
9 Ok(environment) => environment,
10 Err(error) => {
11 println!("environment APIs require macOS 15+: {error}");
12 return Ok(());
13 }
14 };
15
16 let notifications = Arc::new(AtomicUsize::new(0));
17 let registration = environment.add_observer({
18 let notifications = Arc::clone(¬ifications);
19 move |environment: &LAEnvironment, old_state: &LAEnvironmentState| {
20 let current_count = environment
21 .state()
22 .and_then(|state| state.all_mechanisms().map(|items| items.len()))
23 .unwrap_or_default();
24 let previous_count = old_state
25 .all_mechanisms()
26 .map(|items| items.len())
27 .unwrap_or_default();
28 println!(
29 "environment changed: {previous_count} -> {current_count} mechanisms"
30 );
31 notifications.fetch_add(1, Ordering::Relaxed);
32 }
33 })?;
34
35 let state = environment.state()?;
36 println!("all mechanisms: {}", state.all_mechanisms()?.len());
37
38 if let Some(biometry) = state.biometry()? {
39 println!(
40 "biometry: {:?}, enrolled={}, usable={}, icon={}",
41 biometry.biometry_type()?,
42 biometry.is_enrolled()?,
43 biometry.is_usable()?,
44 biometry.icon_system_name()?
45 );
46 }
47
48 if let Some(user_password) = state.user_password()? {
49 println!(
50 "user password: set={}, usable={}, label={}",
51 user_password.is_set()?,
52 user_password.is_usable()?,
53 user_password.localized_name()?
54 );
55 }
56
57 for companion in state.companions()? {
58 println!(
59 "companion {:?}: usable={}, state-hash-bytes={}",
60 companion.companion_type()?,
61 companion.is_usable()?,
62 companion.state_hash()?.map_or(0, |hash| hash.len())
63 );
64 }
65
66 environment.remove_observer(®istration)?;
67 println!(
68 "observer notifications seen so far: {}",
69 notifications.load(Ordering::Relaxed)
70 );
71 println!("✅ environment smoke OK");
72 Ok(())
73}Sourcepub fn state(&self) -> Result<LAEnvironmentState>
pub fn state(&self) -> Result<LAEnvironmentState>
Snapshot the current environment state.
§Errors
Returns an error if the macOS 15 environment APIs are unavailable or the Swift bridge rejects the request.
Examples found in repository?
7fn main() -> Result<(), Box<dyn std::error::Error>> {
8 let environment = match LAEnvironment::current_user() {
9 Ok(environment) => environment,
10 Err(error) => {
11 println!("environment APIs require macOS 15+: {error}");
12 return Ok(());
13 }
14 };
15
16 let notifications = Arc::new(AtomicUsize::new(0));
17 let registration = environment.add_observer({
18 let notifications = Arc::clone(¬ifications);
19 move |environment: &LAEnvironment, old_state: &LAEnvironmentState| {
20 let current_count = environment
21 .state()
22 .and_then(|state| state.all_mechanisms().map(|items| items.len()))
23 .unwrap_or_default();
24 let previous_count = old_state
25 .all_mechanisms()
26 .map(|items| items.len())
27 .unwrap_or_default();
28 println!(
29 "environment changed: {previous_count} -> {current_count} mechanisms"
30 );
31 notifications.fetch_add(1, Ordering::Relaxed);
32 }
33 })?;
34
35 let state = environment.state()?;
36 println!("all mechanisms: {}", state.all_mechanisms()?.len());
37
38 if let Some(biometry) = state.biometry()? {
39 println!(
40 "biometry: {:?}, enrolled={}, usable={}, icon={}",
41 biometry.biometry_type()?,
42 biometry.is_enrolled()?,
43 biometry.is_usable()?,
44 biometry.icon_system_name()?
45 );
46 }
47
48 if let Some(user_password) = state.user_password()? {
49 println!(
50 "user password: set={}, usable={}, label={}",
51 user_password.is_set()?,
52 user_password.is_usable()?,
53 user_password.localized_name()?
54 );
55 }
56
57 for companion in state.companions()? {
58 println!(
59 "companion {:?}: usable={}, state-hash-bytes={}",
60 companion.companion_type()?,
61 companion.is_usable()?,
62 companion.state_hash()?.map_or(0, |hash| hash.len())
63 );
64 }
65
66 environment.remove_observer(®istration)?;
67 println!(
68 "observer notifications seen so far: {}",
69 notifications.load(Ordering::Relaxed)
70 );
71 println!("✅ environment smoke OK");
72 Ok(())
73}Sourcepub fn add_observer<O>(
&self,
observer: O,
) -> Result<LAEnvironmentObserverRegistration>where
O: LAEnvironmentObserver,
pub fn add_observer<O>(
&self,
observer: O,
) -> Result<LAEnvironmentObserverRegistration>where
O: LAEnvironmentObserver,
Register an observer for environment state changes.
Keep the returned registration alive for as long as the observer should remain registered. Dropping it releases the weakly-held observer object.
§Errors
Returns an error if the macOS 15 environment APIs are unavailable or the Swift bridge rejects the request.
Examples found in repository?
7fn main() -> Result<(), Box<dyn std::error::Error>> {
8 let environment = match LAEnvironment::current_user() {
9 Ok(environment) => environment,
10 Err(error) => {
11 println!("environment APIs require macOS 15+: {error}");
12 return Ok(());
13 }
14 };
15
16 let notifications = Arc::new(AtomicUsize::new(0));
17 let registration = environment.add_observer({
18 let notifications = Arc::clone(¬ifications);
19 move |environment: &LAEnvironment, old_state: &LAEnvironmentState| {
20 let current_count = environment
21 .state()
22 .and_then(|state| state.all_mechanisms().map(|items| items.len()))
23 .unwrap_or_default();
24 let previous_count = old_state
25 .all_mechanisms()
26 .map(|items| items.len())
27 .unwrap_or_default();
28 println!(
29 "environment changed: {previous_count} -> {current_count} mechanisms"
30 );
31 notifications.fetch_add(1, Ordering::Relaxed);
32 }
33 })?;
34
35 let state = environment.state()?;
36 println!("all mechanisms: {}", state.all_mechanisms()?.len());
37
38 if let Some(biometry) = state.biometry()? {
39 println!(
40 "biometry: {:?}, enrolled={}, usable={}, icon={}",
41 biometry.biometry_type()?,
42 biometry.is_enrolled()?,
43 biometry.is_usable()?,
44 biometry.icon_system_name()?
45 );
46 }
47
48 if let Some(user_password) = state.user_password()? {
49 println!(
50 "user password: set={}, usable={}, label={}",
51 user_password.is_set()?,
52 user_password.is_usable()?,
53 user_password.localized_name()?
54 );
55 }
56
57 for companion in state.companions()? {
58 println!(
59 "companion {:?}: usable={}, state-hash-bytes={}",
60 companion.companion_type()?,
61 companion.is_usable()?,
62 companion.state_hash()?.map_or(0, |hash| hash.len())
63 );
64 }
65
66 environment.remove_observer(®istration)?;
67 println!(
68 "observer notifications seen so far: {}",
69 notifications.load(Ordering::Relaxed)
70 );
71 println!("✅ environment smoke OK");
72 Ok(())
73}Sourcepub fn remove_observer(
&self,
observer: &LAEnvironmentObserverRegistration,
) -> Result<()>
pub fn remove_observer( &self, observer: &LAEnvironmentObserverRegistration, ) -> Result<()>
Remove a previously registered observer.
§Errors
Returns an error if the macOS 15 environment APIs are unavailable or the Swift bridge rejects the request.
Examples found in repository?
7fn main() -> Result<(), Box<dyn std::error::Error>> {
8 let environment = match LAEnvironment::current_user() {
9 Ok(environment) => environment,
10 Err(error) => {
11 println!("environment APIs require macOS 15+: {error}");
12 return Ok(());
13 }
14 };
15
16 let notifications = Arc::new(AtomicUsize::new(0));
17 let registration = environment.add_observer({
18 let notifications = Arc::clone(¬ifications);
19 move |environment: &LAEnvironment, old_state: &LAEnvironmentState| {
20 let current_count = environment
21 .state()
22 .and_then(|state| state.all_mechanisms().map(|items| items.len()))
23 .unwrap_or_default();
24 let previous_count = old_state
25 .all_mechanisms()
26 .map(|items| items.len())
27 .unwrap_or_default();
28 println!(
29 "environment changed: {previous_count} -> {current_count} mechanisms"
30 );
31 notifications.fetch_add(1, Ordering::Relaxed);
32 }
33 })?;
34
35 let state = environment.state()?;
36 println!("all mechanisms: {}", state.all_mechanisms()?.len());
37
38 if let Some(biometry) = state.biometry()? {
39 println!(
40 "biometry: {:?}, enrolled={}, usable={}, icon={}",
41 biometry.biometry_type()?,
42 biometry.is_enrolled()?,
43 biometry.is_usable()?,
44 biometry.icon_system_name()?
45 );
46 }
47
48 if let Some(user_password) = state.user_password()? {
49 println!(
50 "user password: set={}, usable={}, label={}",
51 user_password.is_set()?,
52 user_password.is_usable()?,
53 user_password.localized_name()?
54 );
55 }
56
57 for companion in state.companions()? {
58 println!(
59 "companion {:?}: usable={}, state-hash-bytes={}",
60 companion.companion_type()?,
61 companion.is_usable()?,
62 companion.state_hash()?.map_or(0, |hash| hash.len())
63 );
64 }
65
66 environment.remove_observer(®istration)?;
67 println!(
68 "observer notifications seen so far: {}",
69 notifications.load(Ordering::Relaxed)
70 );
71 println!("✅ environment smoke OK");
72 Ok(())
73}