Skip to content

Re-export num-traits traits (Unsigned, FromPrimitive) to allow dependents to remove direct num-traits dependency #141

Description

@konard

Problem

platform-trees (and potentially other crates that depend on platform-num) currently need to declare num-traits as a direct dependency even though platform-num already depends on it internally. This is because Rust/Cargo requires explicit direct dependencies — transitive dependencies are not accessible in code.

As a result, platform-trees has:

[dependencies]
num-traits = "0.2.19"      # required for Unsigned, FromPrimitive
platform-num = "0.5.0"     # also internally uses num-traits

This creates a version drift risk: if platform-num upgrades its internal num-traits version (e.g., to 0.3.x) while a dependent still uses 0.2.x, the trait bounds (Unsigned, FromPrimitive) become incompatible types and compilation fails.

Reproducible Example

// Works today, but fragile:
use num_traits::{FromPrimitive, Unsigned}; // from direct dep
use platform_num::Number;                   // from platform-num dep

pub trait LinkType: Number + Unsigned + TryFrom<u8> + FromPrimitive {}

If num-traits versions diverge, Unsigned from one version is not the same type as Unsigned from another, causing a compile error.

Proposed Solution

Add re-exports of the num-traits traits that platform-num already uses internally:

// In platform-num's src/lib.rs
pub use num_traits::{AsPrimitive, FromPrimitive, PrimInt, Signed, ToPrimitive, Unsigned};

This would allow dependents to write:

use platform_num::{Number, FromPrimitive, Unsigned};
// No separate num-traits dependency needed!

And their Cargo.toml could drop the direct num-traits dep entirely:

[dependencies]
platform-num = "0.5.0"   # includes all needed num-traits re-exports

Benefits

  1. Version consistency guaranteed: Dependent crates always use the exact same num-traits version as platform-num
  2. Simpler dependency management for crates in the linksplatform ecosystem
  3. Single source of truth: Only platform-num needs to track the num-traits version

Workaround

Until this is implemented, dependents should pin their num-traits version to match platform-num's exact version:

num-traits = "0.2.19"   # matches platform-num 0.5.0's pinned version

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions