# settings_ui: Move settings UI trait to file content \(\#37337\) · gitcafe/zed

[View on GitCafe](https://git.cafe/gitcafe/zed/commit/60d17cccd35b919d6226ae86559c4505d7c1e833)

Repository: [gitcafe/zed](https://git.cafe/gitcafe/zed)

Visibility: public

Requested revision: 60d17cccd35b919d6226ae86559c4505d7c1e833

Requested commit: 60d17cccd35b919d6226ae86559c4505d7c1e833

Commit: 60d17cccd35b919d6226ae86559c4505d7c1e833

Tree: a4f3156b8a4cc5e3db5e7cf1457738699e0750da

Author: Ben Kunkle

Committer: GitHub

## Message

```
settings_ui: Move settings UI trait to file content (#37337)

Closes #ISSUE

Initially, the `SettingsUi` trait was tied to `Settings`, however, given
that the `Settings::FileContent` type (which may be the same as the type
that implements `Settings`) will be the type that more directly maps to
the JSON structure (and therefore have the documentation, correct field
names (or `serde` rename attributes), etc) it makes more sense to have
the deriving of `SettingsUi` occur on the `FileContent` type rather than
the `Settings` type.

In order for this to work a relatively important change had to be made
to the derive macro, that being that it now "unwraps" options into their
inner type, so a field with type `Option<Foo>` where `Foo: SettingsUi`
will treat the field as if it were just `Foo`, expecting there to be a
default set in `default.json`. This imposes some restrictions on what
`Settings::FileContent` can be as seen in 1e19398 where `FileContent`
itself can't be optional without manually implementing `SettingsUi`, as
well as introducing some risk that if the `FileContent` type has
`serde(default)`, the default value will override the default value from
`default.json` in the UI even though it may differ (but it should!).

A future PR should probably replace the other settings with `FileContent
= Option<T>` (all of which currently have `T == bool`) with wrapper
structs and have `KEY = None` so the further niceties
`derive(SettingsUi)` will provide such as path renaming, custom UI, auto
naming and doc comment extraction can be used.

Release Notes:

- N/A *or* Added/Fixed/Improved ...
```

## Parents

- [8a8a9a4f079ef5a66252ad73d01476d45891e647](https://git.cafe/gitcafe/zed/commit/8a8a9a4f079ef5a66252ad73d01476d45891e647?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zed/tree/60d17cccd35b919d6226ae86559c4505d7c1e833?format=markdown)
