Versioned

Derive Macro Versioned 

Source
#[derive(Versioned)]
{
    // Attributes available to this derive:
    #[versioned]
}
Expand description

Derives the Versioned trait for a struct.

§Attributes

  • #[versioned(version = "x.y.z")]: Specifies the semantic version (required). The version string must be a valid semantic version.
  • #[versioned(version_key = "...")]: Customizes the version field key (optional, default: “version”).
  • #[versioned(data_key = "...")]: Customizes the data field key (optional, default: “data”).
  • #[versioned(auto_tag = true)]: Auto-generates Serialize/Deserialize with version field (optional, default: false). When enabled, the version field is automatically inserted during serialization and validated during deserialization.
  • #[versioned(queryable = true)]: Auto-generates Queryable trait implementation (optional, default: false). Enables use with ConfigMigrator for ORM-like queries.
  • #[versioned(queryable_key = "...")]: Customizes the entity name for Queryable (optional). If not specified, uses the lowercased type name. Only used when queryable = true.

§Examples

Basic usage:

use version_migrate::Versioned;

#[derive(Versioned)]
#[versioned(version = "1.0.0")]
pub struct Task_V1_0_0 {
    pub id: String,
    pub title: String,
}

Custom keys:

#[derive(Versioned)]
#[versioned(
    version = "1.0.0",
    version_key = "schema_version",
    data_key = "payload"
)]
pub struct Task { ... }
// When used with Migrator:
// Serializes to: {"schema_version":"1.0.0","payload":{...}}

Auto-tag for direct serialization:

#[derive(Versioned)]
#[versioned(version = "1.0.0", auto_tag = true)]
pub struct Task {
    pub id: String,
    pub title: String,
}

// Use serde directly without Migrator
let task = Task { id: "1".into(), title: "Test".into() };
let json = serde_json::to_string(&task)?;
// → {"version":"1.0.0","id":"1","title":"Test"}

Queryable for ConfigMigrator:

#[derive(Serialize, Deserialize, Versioned)]
#[versioned(version = "2.0.0", queryable = true, queryable_key = "task")]
pub struct TaskEntity {
    pub id: String,
    pub title: String,
    pub description: Option<String>,
}

// Now TaskEntity implements Queryable automatically
let tasks: Vec<TaskEntity> = config_migrator.query("tasks")?;