# Metadata and tables
Let us create a table and add a row with our mutation metadata:
```rust, noplayground, ignore
{{#include ../../tests/book_metadata.rs:add_mutation_table_row_with_metadata}}
```
Meta data is optional on a per-row basis:
```rust, noplayground, ignore
{{#include ../../tests/book_metadata.rs:add_mutation_table_row_without_metadata}}
```
We can confirm that we have one row with, and one without, metadata:
```rust, noplayground, ignore
{{#include ../../tests/book_metadata.rs:validate_metadata_row_contents}}
```
Fetching our metadata from the table requires specifying the metadata type.
The result of a metadata retrieval is `Option<Result, TskitError>`.
The `None` variant occurs if a row does not have metadata or if a row id does not exist.
The error state occurs if decoding raw bytes into the metadata type fails.
The details of the error variant are [here](https://docs.rs/tskit/latest/tskit/error/enum.TskitError.html#variant.MetadataError).
The reason why the error type holds `Box<dyn Error>` is that the API is very general.
We assume nothing about the API used to encode/decode metadata.
Therefore, the error could be anything.
```rust, noplayground, ignore
{{#include ../../tests/book_metadata.rs:metadata_retrieval}}
```
```rust, noplayground, ignore
{{#include ../../tests/book_metadata.rs:metadata_retrieval_none}}
```