# Creating a FIDL library

## Prerequisites

This tutorial expects that you have completed the [getting
started][getting-started] guide and are able to build and run Fuchsia.  You
should be familiar with running components on Fuchsia, which is covered in [run
an example component][run-examples].

## Overview

In this tutorial, you will define and build the FIDL library
`examples.keyvaluestore.baseline`. After you're done, you'll know how to author
a FIDL file, set up necessary GN rules, and build FIDL bindings.

The full source for this tutorial can be found at
[//examples/fidl/new/key_value_store/baseline/fidl/][baseline]

Note: This library will be used later in the [key-value store example series].

## Define the FIDL library

First, create a directory for this tutorial by running the following command
from your fuchsia checkout:

```
mkdir -p vendor/fidl-tutorials/building-fidl
```

Create a new file, `key_value_store.test.fidl`:

```
touch vendor/fidl-tutorials/building-fidl/key_value_store.test.fidl
```

FIDL file names use the `.fidl` extension. Similar to C header files, FIDL files
define data types and declare functional interfaces. These declarations are used in
conjunction with FIDL-specific data types to communicate between FIDL endpoints.

Add the following FIDL code to `key_value_store.test.fidl`:

```fidl
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/new/key_value_store/baseline/fidl/key_value_store.test.fidl" %}
```

This FIDL defines an `Item` type to represent items in the store, a `WriteError`
enum to list known errors for writes, and a `Store` protocol with one method:
`WriteItem`. As defined, this library can only write values into a store, but in
the [key-value store example series], you'll augment this library to support
nested stores, reading values, and other features.

Note: The `test.fidl` extension is used instead of `.fidl` to avoid linting and
API review requirements. Use `.fidl` for production code.

## Create a GN target for the FIDL library

Now that you've defined your FIDL, you need to create a `gn` target that other
code can depend on.

Create a new file, `BUILD.gn`:

```
touch vendor/fidl-tutorials/building-fidl/BUILD.gn
```

and add the following build rules:

```gn
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/new/key_value_store/baseline/fidl/BUILD.gn" %}
```

The `gn` template [`fidl("examples.keyvaluestore.baseline")`][fidl-template]
creates the necessary targets to use this library from other code.

## Compile the FIDL library

To build your new FIDL library, run the following `fx set` command:

```
fx set core.x64\
  --with //vendor/fidl-tutorials/building-fidl:examples.keyvaluestore.baseline_rust\
  --with //vendor/fidl-tutorials/building-fidl:examples.keyvaluestore.baseline_cpp
```

This command configures `fx build` to generate the rust and cpp bindings.

Next, build the code:

```
fx build
```

## Explore the generated bindings

Now that the code is built, you can explore the generated code for your
bindings. To see the generated code, browse the following directories:

| binding type | directory                                                                                                                                   |
|--------------|---------------------------------------------------------------------------------------------------------------------------------------------|
| rust         | //out/default/fidling/gen/vendor/fidl-tutorials/building-fidl/examples.keyvaluestore.baseline/rust/                                         |
| new c++      | //out/default/fidling/gen/vendor/fidl-tutorials/building-fidl/examples.keyvaluestore.baseline/cpp/fidl/examples.keyvaluestore.baseline/cpp/ |

See [generated code] for more details.


## Next steps

Now that you've finished this tutorial, you're ready to explore the full
[key-value store example series].

<!-- xrefs -->
[fidl-template]: /build/fidl/fidl.gni
[getting-started]: /docs/get-started/README.md
[run-examples]: /docs/development/run/run-examples.md
[example series]: /docs/development/languages/fidl/examples.md
[key-value store example series]: /docs/development/languages/fidl/examples/key_value_store/README.md
[baseline]: https://cs.opensource.google/fuchsia/fuchsia/+/main:examples/fidl/new/key_value_store/baseline/fidl/
[generated code]: /docs/development/languages/fidl/guides/generated-code.md
