abi_stable/library/
development_utils.rs

1//! Utilities for use while developing dynamic libraries.
2
3use std::{
4    io,
5    path::{Path, PathBuf},
6};
7
8use crate::library::RootModule;
9
10/// Returns the path in the target directory
11/// to the last version of an implementation crate's dynamic library.
12///
13/// The path can be in either the "debug" or "release" subdirectories.
14pub fn compute_library_path<M: RootModule>(target_path: &Path) -> io::Result<PathBuf> {
15    let debug_dir = target_path.join("debug/");
16    let release_dir = target_path.join("release/");
17
18    let debug_path = M::get_library_path(&debug_dir);
19    let release_path = M::get_library_path(&release_dir);
20
21    Ok(match (debug_path.exists(), release_path.exists()) {
22        (false, false) => debug_dir,
23        (true, false) => debug_dir,
24        (false, true) => release_dir,
25        (true, true) => {
26            if debug_path.metadata()?.modified()? < release_path.metadata()?.modified()? {
27                release_dir
28            } else {
29                debug_dir
30            }
31        }
32    })
33}