Attribute Macro vector_config::configurable_component

source ·
#[configurable_component]
Expand description

Designates a type as being part of a Vector configuration.

This will automatically derive the [Configurable][vector-config::Configurable] trait for the given struct/enum, as well as ensuring that serialization/deserialization (via serde) is derived.

§Basics

In its most basic form, this attribute macro can be used to simply derive the aforementioned traits, making it using in any other type also deriving Configurable:

use vector_config::configurable_component;
use serde;

/// Batching configurations.
#[configurable_component]
#[derive(Clone, Debug)]
pub struct BatchSettings {
  // ...
}

§Component-specific modifiers

Additionally, callers can specify the component type, when being used directly on the top-level configuration object for a component by specifying the component type (enrichment_table, provider, sink, source, or transform) and the name of the component:

use vector_config::configurable_component;
use serde;

/// Configuration for the `kafka` source.
#[configurable_component(source("kafka"))]
#[derive(Clone, Debug)]
pub struct KafkaSourceConfig {
  // ...
}

This adds special metadata to the generated schema for that type, which indicates that it represents the top-level configuration object as a component of the given type. Additionally, relevant traits and annotations will be added to register the component (using the given name) within Vector, for the purposes of example configuration generation, and so on.

§Opting out of automatic derives

This macro will also derive the Deserialize and Serialize traits from serde automatically, as a way to clean up the derives of a type which is already using #[configurable_component]. However, some types employ custom (de)serialization implementations and do not need a standard derivation of those traits. In those cases, callers can mark the type as not needing automatic derivations in a piecemeal fashion with the no_ser and/or no_deser modifiers:

use vector_config::configurable_component;

/// Helper type with custom deserialization logic.
#[configurable_component(no_deser)]
pub struct HelperTypeWithCustomDeser {
  // This type brings its own implementation of `Deserialize` so we simply avoid bringing it in
  // via `#[configurable_component]` but `Serialize` is still being automatically derived for us.
}

/// Helper type with entirely custom (de)serialization logic.
#[configurable_component(no_deser, no_ser)]
pub struct HelperTypeWithCustomDeserAndSer {
  // This type brings its own implementation of `Deserialize` _and_ `Serialize` so we've avoided
  // having them automatically derived via `#[configurable_component]`.
}