IntoActiveValue is not implemented for Vec<String>
Description
I am trying to implement DeriveIntoActiveModel for the following struct
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema, DeriveIntoActiveModel)]
pub struct BusinessCreate {
pub location: Option<String>,
pub how_we_sell_products: Option<String>,
...
pub tags: Vec<String>,
}
I have a field called tags that just contains a field of strings. When using the macro, I get the following error:
the trait `IntoActiveValue<_>` is not implemented for `std::vec::Vec<std::string::String>`
Is there a way around this?
Looks like implementations are defined starting here for the following:
- Option<V>> where V: IntoActiveValue<V> + Into<Value> + Nullable,
- Option<Option<V>> where V: IntoActiveValue<V> + Into<Value> + Nullable,
- bool
- i8
- i16
- i32
- i64
- u8
- u16
- u32
- u64
- f32
- f64
- &'static str
- String
- Vec<u8>
The first two are implemented manually, with the rest being implemented using the impl_into_active_value macro. The explanation for the implementation being only for Vec<u8> and not other Vec types is presumably that ActiveValue::Set(V) has the trait bound V: Into<Value>, and Into<Value> is implemented for Vec<u8> because Vec<u8> is converted into Value::Bytes. It's also implemented here for Vec<V>, but inside a module that requires the "postgres-array" feature to be enabled. Any fix for this would therefore need to be gated behind the "postgres-array" feature in order to work properly.
Edit: I tried doing this
#[cfg(feature = "postgres-array")] impl<V> IntoActiveValue<Vec<V>> for Vec<V> where V: IntoActiveValue<V> + Into<Value> + Nullable + sea_query::ValueType + sea_query::with_array::NotU8
but got an error helpfully informing me that
upstream crates may add a new impl of trait
sea_query::with_array::NotU8for typeu8in future versions
Removing the sea_query::with_array::NotU8 bound produces conflicting implementations. Removing the NotU8 bound and deleting impl_into_active_value!(Vec<u8>) just gives me an error informing me that
the trait bound
V: NotU8is not satisfied required forsea_query::Valueto implementFrom<Vec<V>>required forVec<V>to implement `Into<sea_query::Value>
So it looks like we might be blocked on the stabilization of negative trait bounds.