Rust decimal to roman numeral kata
cargo fmt and cargo clippy
Use cargo fmt to format your code according to the official Rust
Style Guide.
Clippy's suggestions:

collapse else { if .. } into else if ..;

change self.base = self.base - 1 to self.base -= 1;

use write_all instead of write when writing a slice of bytes,
since the latter only makes one writing attempt:

io::Write::write(_vectored) and io::Read::read(_vectored) are
not guaranteed to process the entire buffer. They return how many
bytes were processed, which might be smaller than a given buffer’s
length. If you don’t need to deal with partial-write/read, use
write_all/read_exact instead.  (source)



The interface
Instead of passing in a tuple, it is preferable to pass separate
parameters:
fn encode(decimal_number: char, base: usize) -&gt; String {
    // ...
}

Now, we notice that the interface is fairly curious.  A better
self-explanatory interface might simply be:
fn to_roman(number: u32) -&gt; String {
    // ...
}

which can be coded to encapsulate calls to encode while avoiding
repetitive allocation.
Grouping use declarations
It's common to group use declarations together:
use std::{
    env,
    io::{self, BufWriter, Write},
};

The Bases utility
Bases is not necessary — you can use (0..n).rev() to iterate
from n - 1 to 0.