Skip to content

Commit 835ebea

Browse files
committed
Overhaul examples for PermissionsExt
This fixes #91707 by including one overarching example, instead of the small examples that can be misleading.
1 parent 8231e85 commit 835ebea

File tree

1 file changed

+75
-49
lines changed
  • library/std/src/os/unix

1 file changed

+75
-49
lines changed

library/std/src/os/unix/fs.rs

+75-49
Original file line numberDiff line numberDiff line change
@@ -276,63 +276,89 @@ impl FileExt for fs::File {
276276
}
277277

278278
/// Unix-specific extensions to [`fs::Permissions`].
279+
///
280+
/// # Examples
281+
///
282+
/// ```no_run
283+
/// use std::fs::{File, Permissions};
284+
/// use std::io::{ErrorKind, Result as IoResult};
285+
/// use std::os::unix::fs::PermissionsExt;
286+
///
287+
/// fn main() -> IoResult<()> {
288+
/// let name = "test_file_for_permissions";
289+
///
290+
/// // make sure file does not exist
291+
/// let _ = std::fs::remove_file(name);
292+
/// assert_eq!(
293+
/// File::open(name).unwrap_err().kind(),
294+
/// ErrorKind::NotFound,
295+
/// "file already exists"
296+
/// );
297+
///
298+
/// // full read/write/execute mode bits for owner of file
299+
/// // that we want to add to existing mode bits
300+
/// let my_mode = 0o700;
301+
///
302+
/// // create new file with specified permissions
303+
/// {
304+
/// let file = File::create(name)?;
305+
/// let mut permissions = file.metadata()?.permissions();
306+
/// eprintln!("Current permissions: {:o}", permissions.mode());
307+
///
308+
/// // make sure new permissions are not already set
309+
/// assert!(
310+
/// permissions.mode() & my_mode != my_mode,
311+
/// "permissions already set"
312+
/// );
313+
///
314+
/// // either use `set_mode` to change an existing Permissions struct
315+
/// permissions.set_mode(permissions.mode() | my_mode);
316+
///
317+
/// // or use `from_mode` to construct a new Permissions struct
318+
/// permissions = Permissions::from_mode(permissions.mode() | my_mode);
319+
///
320+
/// // write new permissions to file
321+
/// file.set_permissions(permissions)?;
322+
/// }
323+
///
324+
/// let permissions = File::open(name)?.metadata()?.permissions();
325+
/// eprintln!("New permissions: {:o}", permissions.mode());
326+
///
327+
/// // assert new permissions were set
328+
/// assert_eq!(
329+
/// permissions.mode() & my_mode,
330+
/// my_mode,
331+
/// "new permissions not set"
332+
/// );
333+
/// Ok(())
334+
/// }
335+
/// ```
336+
///
337+
/// ```no_run
338+
/// use std::fs::Permissions;
339+
/// use std::os::unix::fs::PermissionsExt;
340+
///
341+
/// // read/write for owner and read for others
342+
/// let my_mode = 0o644;
343+
/// let mut permissions = Permissions::from_mode(my_mode);
344+
/// assert_eq!(permissions.mode(), my_mode);
345+
///
346+
/// // read/write/execute for owner
347+
/// let other_mode = 0o700;
348+
/// permissions.set_mode(my_other_mode);
349+
/// assert_eq!(permissions.mode(), my_other_mode);
350+
/// ```
279351
#[stable(feature = "fs_ext", since = "1.1.0")]
280352
pub trait PermissionsExt {
281-
/// Returns the underlying raw `st_mode` bits that contain the standard
282-
/// Unix permissions for this file.
283-
///
284-
/// # Examples
285-
///
286-
/// ```no_run
287-
/// use std::fs::File;
288-
/// use std::os::unix::fs::PermissionsExt;
289-
///
290-
/// fn main() -> std::io::Result<()> {
291-
/// let f = File::create("foo.txt")?;
292-
/// let metadata = f.metadata()?;
293-
/// let permissions = metadata.permissions();
294-
///
295-
/// println!("permissions: {:o}", permissions.mode());
296-
/// Ok(())
297-
/// }
298-
/// ```
353+
/// Returns the mode permission bits
299354
#[stable(feature = "fs_ext", since = "1.1.0")]
300355
fn mode(&self) -> u32;
301356

302-
/// Sets the underlying raw bits for this set of permissions.
303-
///
304-
/// # Examples
305-
///
306-
/// ```no_run
307-
/// use std::fs::File;
308-
/// use std::os::unix::fs::PermissionsExt;
309-
///
310-
/// fn main() -> std::io::Result<()> {
311-
/// let f = File::create("foo.txt")?;
312-
/// let metadata = f.metadata()?;
313-
/// let mut permissions = metadata.permissions();
314-
///
315-
/// permissions.set_mode(0o644); // Read/write for owner and read for others.
316-
/// assert_eq!(permissions.mode(), 0o644);
317-
/// Ok(())
318-
/// }
319-
/// ```
357+
/// Sets the mode permission bits.
320358
#[stable(feature = "fs_ext", since = "1.1.0")]
321359
fn set_mode(&mut self, mode: u32);
322360

323-
/// Creates a new instance of `Permissions` from the given set of Unix
324-
/// permission bits.
325-
///
326-
/// # Examples
327-
///
328-
/// ```
329-
/// use std::fs::Permissions;
330-
/// use std::os::unix::fs::PermissionsExt;
331-
///
332-
/// // Read/write for owner and read for others.
333-
/// let permissions = Permissions::from_mode(0o644);
334-
/// assert_eq!(permissions.mode(), 0o644);
335-
/// ```
361+
/// Creates a new instance from the given mode permission bits.
336362
#[stable(feature = "fs_ext", since = "1.1.0")]
337363
#[cfg_attr(not(test), rustc_diagnostic_item = "permissions_from_mode")]
338364
fn from_mode(mode: u32) -> Self;

0 commit comments

Comments
 (0)