Skip to content

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

@konard

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions