use std::path::{Path, PathBuf};
use crate::error::I2cDevError;
pub fn connector_ddc_adapter(connector: &str) -> Result<PathBuf, I2cDevError> {
connector_ddc_adapter_in(Path::new("/sys/class/drm"), connector)
}
pub(crate) fn connector_ddc_adapter_in(
drm_root: &Path,
connector: &str,
) -> Result<PathBuf, I2cDevError> {
let connector_dir = drm_root.join(connector);
if !connector_dir.exists() {
return Err(I2cDevError::ConnectorNotFound {
connector: connector.to_string(),
});
}
let ddc_path = connector_dir.join("ddc");
let symlink_target =
std::fs::read_link(&ddc_path).map_err(|_| I2cDevError::ConnectorHasNoDdcAdapter {
connector: connector.to_string(),
})?;
let last = symlink_target
.file_name()
.and_then(|s| s.to_str())
.ok_or_else(|| I2cDevError::DdcAdapterIndexUnparseable {
symlink_target: symlink_target.clone(),
})?;
let index = last
.strip_prefix("i2c-")
.filter(|s| !s.is_empty() && s.chars().all(|c| c.is_ascii_digit()))
.ok_or_else(|| I2cDevError::DdcAdapterIndexUnparseable {
symlink_target: symlink_target.clone(),
})?;
Ok(PathBuf::from(format!("/dev/i2c-{index}")))
}
#[cfg(test)]
#[path = "discovery_tests.rs"]
mod tests;