Remove leading '&'-reference from generic type

Is there a way to remove the leading reference on a generic so something like this is possible? The goal is to take either &T or T but still constrain on T::from and call T::from (not &T::From).

fn foo<T>(new: T) -> <T as std::ops::Mul<T>>::Output
where
    T: std::ops::Mul<T> + Copy + From<i32>
{
    new * T::from(100)
}

fn main() {
  println!("{}", foo(&100));
}
error[E0277]: the trait bound `&{integer}: From<i32>` is not satisfied
  --> src/main.rs:11:22
   |
11 |   println!("{}", foo(&100));
   |                  --- ^^^^ the trait `From<i32>` is not implemented for `&{integer}`
   |                  |
   |                  required by a bound introduced by this call
   |
note: required by a bound in `foo`
  --> src/main.rs:5:34
   |
 3 | pub fn foo<T>(new: T) -> <T as std::ops::Mul<T>>::Output
   |        --- required by a bound in this function
 4 | where
 5 |     T: std::ops::Mul<T> + Copy + From<i32>
   |                                  ^^^^^^^^^ required by this bound in `foo`
help: consider removing the leading `&`-reference

You might be able to achieve what you're after using Borrow<T> (see: https://stackoverflow.com/questions/62205437/can-one-do-generics-over-references-and-non-references)?

The borrow approach doesn't play nice with inference.

Do you really need the From, or do you need T: Mul<i32>?

An external type I want the function to support does not implement Mul<i32> which is how I ended up going down the From path. Could not remember them earlier but was looking for something like std::decay and std::remove_reference in C++.

For the actual usage it probably just won't support references as the types should be small enough it won't matter. Just couldn't help wondering if it was possible and if so how.

doing stuff by value and by borrow are two fundamantally different task so i think you should just have two implementation or should dereference the value at the callsite and pass by value