fn from_hwmon(components: &mut Vec<Component>, folder: &Path) -> Option<()> {
        let dir = read_dir(folder).ok()?;
        let mut matchings: HashMap<u32, Component> = HashMap::with_capacity(10);
        for entry in dir.flatten() {
            if !entry.file_type().is_ok_and(|file_type| !file_type.is_dir()) {
                continue;
            }

            let entry = entry.path();
            let filename = entry.file_name().and_then(|x| x.to_str()).unwrap_or("");
            let Some((id, item)) = filename
                .strip_prefix("temp")
                .and_then(|f| f.split_once('_'))
                .and_then(|(id, item)| Some((id.parse::<u32>().ok()?, item)))
            else {
                continue;
            };

            let component = matchings.entry(id).or_insert_with(|| Component {
                inner: ComponentInner::default(),
            });
            let component = &mut component.inner;
            let name = get_file_line(&folder.join("name"), 16);
            component.name = name.unwrap_or_default();
            let device_model = get_file_line(&folder.join("device/model"), 16);
            component.device_model = device_model;
            fill_component(component, item, folder, filename);
        }
        for (id, mut new_comp) in matchings
            .into_iter()
            // Remove components without `tempN_input` file termal. `Component` doesn't support this
            // kind of sensors yet
            .filter(|(_, c)| c.inner.input_file.is_some())
        {
            // compute label from known data
            new_comp.inner.label = new_comp.inner.format_label("temp", id);
            if let Some(comp) = components
                .iter_mut()
                .find(|comp| comp.inner.label == new_comp.inner.label)
            {
                comp.inner.update_from(new_comp);
            } else {
                new_comp.inner.updated = true;
                components.push(new_comp);
            }
        }

        Some(())
    }
Read out `hwmon` info (hardware monitor) from `folder`
to get values' path to be used on refresh as well as files containing `max`,
`critical value` and `label`. Then we store everything into `components`.

Note that a thermal [Component] must have a way to read its temperature.
If not, it will be ignored and not added into `components`.

## What is read:

- Mandatory: `name` the name of the `hwmon`.
- Mandatory: `tempN_input` Drop [Component] if missing
- Optional: sensor `label`, in the general case content of `tempN_label`
see below for special cases
- Optional: `label`
- Optional: `/device/model`
- Optional: highest historic value in `tempN_highest`.
- Optional: max threshold value defined in `tempN_max`
- Optional: critical threshold value defined in `tempN_crit`

Where `N` is a `u32` associated to a sensor like `temp1_max`, `temp1_input`.

## Doc to Linux kernel API.

Kernel hwmon API: https://www.kernel.org/doc/html/latest/hwmon/hwmon-kernel-api.html
DriveTemp kernel API: https://docs.kernel.org/gpu/amdgpu/thermal.html#hwmon-interfaces
Amdgpu hwmon interface: https://www.kernel.org/doc/html/latest/hwmon/drivetemp.html
src/unix/linux/component.rs