### 4 releases (2 breaking)

0.3.0 | Nov 23, 2022 |
---|---|

0.2.1 | Oct 19, 2022 |

0.2.0 | Oct 19, 2022 |

0.1.0 | Oct 18, 2022 |

#**336** in Testing

**750** downloads per month

Used in **3** crates

**MIT**license

11KB

137 lines

# Arbitrary Ext

Since

Arbitrary supports custom arbitrary implementation for fields on derive.`1.``2``.``0`

But it still remains tricky, if a type that does not implement

is wrapped into a generic type.`Arbitrary`

This crate provides s set of function combinators to support the containers and collections form the standard library.

See the example below.

## Usage

`use` `arbitrary_ext``::``{`arbitrary_option`,` arbitrary_vec`,` arbitrary_hash_map`}``;`
`use` `std``::``collections``::`HashMap`;`
`//` Imagine this is a foreign type, that by some reason does not implement Arbitrary trait.
`#``[``derive``(``Debug``,` PartialEq`,` Eq`,` PartialOrd`,` Ord`,` Hash`)``]`
`struct` `Number``(``u32``)``;`
`//` Our custom function to generate arbitrary Number out of Unstructured.
`fn` `arbitrary_number``(``u``:` `&``mut` Unstructured`)`` ``->` `arbitrary``::``Result``<`Number`>` `{`
`let` value `=` u`.``int_in_range``(``0``..``=``1000``)``?``;`
`Ok``(`Number`(`value`)``)`
`}`
`#``[``derive``(``Debug``,` Arbitrary`)``]`
`struct` `Example` `{`
`#``[``arbitrary``(``with ``=` arbitrary_number`)``]`
`number``:` Number,
`#``[``arbitrary``(``with ``=` `arbitrary_option``(``arbitrary_number``)``)``]`
`option``:` `Option``<`Number`>`,
`#``[``arbitrary``(``with ``=` `arbitrary_vec``(``arbitrary_number``)``)``]`
`vec``:` `Vec``<`Number`>`,
`#``[``arbitrary``(``
with ``=` `arbitrary_hash_map``(``
arbitrary_number``,`
`arbitrary_vec``(``arbitrary_option``(`arbitrary_number`)``)`
`)`
`)``]`
`hash_map``:` `HashMap``<`Number, `Vec``<``Option``<`Number`>``>``>`,
`}`

Without having

, `arbitrary_option`

, `arbitrary_vec`

combinators, would be forced to implement out custom functions to generate
arbitrary `arbitrary_hash_map`

, `Option``<`Number`>`

and `Vec``<`Number`>`

. e.g.:`HashMap <Number, Vec<Option<Number>>>`

`fn` `arbitrary_option_number``(``u``:` `&``mut` Unstructured`)`` ``->` `arbitrary``::``Result``<``Option``<`Number`>``>``;`
`fn` `arbitrary_vec_number``(``u``:` `&``mut` Unstructured`)`` ``->` `arbitrary``::``Result``<``Vec``<`Number`>``>``;`
`fn` `arbitrary_hash_map_of_numbers``(``u``:` `&``mut` Unstructured`)`` ``->` `arbitrary``::``Result``<`HashMap`<`Number, `Vec``<``Option``<`Number`>``>``>``>``;`

But this becomes tedious very quickly.

## History of the crate

Initially the crate was created to workaround this Arbitrary issue but it was later addressed in this PR.

#### Dependencies

~0.4–0.8MB

~19K SLoC