Skip to main content

Crate draftline

Crate draftline 

Source
Expand description

Draftline provides Git-native versioning for creative content workflows.

The public API uses content-workflow terms such as Workspace, Version, and Variation while keeping Git as an implementation detail for most callers.

§Content policy

Use ContentPolicy to define which workspace files are user content.

use draftline::{ContentPolicy, Workspace};

fn main() -> Result<(), draftline::DraftlineError> {
    let policy = ContentPolicy::new()
        .include_paths(["content", "assets"])?
        .include_extensions(["md", "txt"])?
        .exclude_paths(["content/private"])?;

    let workspace = Workspace::init_with_policy("my-content", policy)?;
    Ok(())
}

§Variation metadata

Variation names are stable Draftline identifiers. Hosts can attach display metadata such as labels and slugs without changing the underlying name.

use draftline::{VariationMetadata, Workspace};

fn main() -> Result<(), draftline::DraftlineError> {
    let workspace = Workspace::init("my-content")?;
    let version = workspace.save_version("Initial draft")?;
    let variation = workspace.create_variation_from_with_metadata(
        version.id(),
        "draft-a",
        VariationMetadata::new()
            .with_label("Draft A")
            .with_slug("draft-a"),
    )?;

    assert_eq!(variation.display_label(), "Draft A");
    Ok(())
}

§Remote credentials

Remote operations accept credential callbacks so host applications can provide credentials from their own authentication flow.

use draftline::{RemoteCredential, RemoteOptions, Workspace};

fn main() -> Result<(), draftline::DraftlineError> {
    let token = std::env::var("GITHUB_TOKEN").unwrap();
    let mut options = RemoteOptions::new().with_credentials(move |request| {
        if request.allows_username_password {
            Ok(RemoteCredential::UsernamePassword {
                username: "x-access-token".to_string(),
                password: token.clone(),
            })
        } else {
            Ok(RemoteCredential::Default)
        }
    });

    let workspace = Workspace::open("my-content")?;
    workspace.fetch_remote_with_options("origin", &mut options)?;
    Ok(())
}

Re-exports§

pub use content_policy::ContentPolicy;
pub use error::DraftlineError;
pub use error::Result;
pub use profile::AttributionOperation;
pub use profile::ContributorProfile;
pub use profile::ContributorProvider;
pub use recovery::RecoveryOperation;
pub use recovery::RecoveryState;
pub use remote::Contributor;
pub use remote::PublishPreflight;
pub use remote::PublishResult;
pub use remote::PublishToken;
pub use remote::RemoteCredential;
pub use remote::RemoteCredentialRequest;
pub use remote::RemoteEndpoint;
pub use remote::RemoteOptions;
pub use remote::RemoteVersionSummary;
pub use remote::SyncState;
pub use remote::SyncStatus;
pub use workspace::AdoptionPreflightReport;
pub use workspace::ApplyIncomingReport;
pub use workspace::ApplyIncomingResult;
pub use workspace::ChangeKind;
pub use workspace::ChangeSet;
pub use workspace::ChangedFile;
pub use workspace::ContentPolicyAudit;
pub use workspace::CurrentFileDiff;
pub use workspace::CurrentFilePreview;
pub use workspace::DiagnosticCode;
pub use workspace::DiagnosticSeverity;
pub use workspace::DirtySummary;
pub use workspace::ErrorExplanation;
pub use workspace::FileHazard;
pub use workspace::FileHazardKind;
pub use workspace::HistoryEntry;
pub use workspace::MergeConflictResolution;
pub use workspace::MergeIncomingReport;
pub use workspace::MergeIncomingResult;
pub use workspace::MergeIncomingToken;
pub use workspace::MergeResolutionChoice;
pub use workspace::OperationLockInspection;
pub use workspace::OperationLockMetadata;
pub use workspace::OperationLockState;
pub use workspace::OperationLockSummary;
pub use workspace::PreflightReport;
pub use workspace::PreviewFile;
pub use workspace::PurgePreflight;
pub use workspace::PurgeToken;
pub use workspace::PurgeVerification;
pub use workspace::RecoveryRepairResult;
pub use workspace::RemoteHistoryReplacePreflight;
pub use workspace::RemoteHistoryReplaceToken;
pub use workspace::RemoteVariation;
pub use workspace::RemoteVariationDeletePreflight;
pub use workspace::RemoteVariationDeleteToken;
pub use workspace::RemoteVariationDiagnostics;
pub use workspace::RestoreVersionTarget;
pub use workspace::RetryClass;
pub use workspace::SafeNextAction;
pub use workspace::SharingMode;
pub use workspace::Shelf;
pub use workspace::ShelfApplyReport;
pub use workspace::SquashVersionsPreflight;
pub use workspace::SquashVersionsToken;
pub use workspace::SupportRef;
pub use workspace::SupportRefExpirationPreflight;
pub use workspace::SupportRefExpirationToken;
pub use workspace::SupportRefKind;
pub use workspace::SupportRefPublishItem;
pub use workspace::SupportRefPublishPreflight;
pub use workspace::SupportRefPublishToken;
pub use workspace::SupportRefRestorePreflight;
pub use workspace::SupportRefRestoreToken;
pub use workspace::SupportRefScope;
pub use workspace::SupportRefSummary;
pub use workspace::SwitchPolicy;
pub use workspace::TargetedRestoreVersionResult;
pub use workspace::Variation;
pub use workspace::VariationDeletePreflight;
pub use workspace::VariationDeleteToken;
pub use workspace::VariationId;
pub use workspace::VariationMetadata;
pub use workspace::VariationSummary;
pub use workspace::Version;
pub use workspace::VersionDiff;
pub use workspace::VersionId;
pub use workspace::VersionPreview;
pub use workspace::Workspace;
pub use workspace::WorkspaceCapabilities;
pub use workspace::WorkspaceDiagnostic;
pub use workspace::WorkspaceId;
pub use workspace::WorkspaceInspection;
pub use workspace::WorkspaceSummary;
pub use workspace::WorkspaceVerification;

Modules§

content_policy
error
merge
path
profile
recovery
remote
tauri_contract
Dependency-free command adapter for Tauri Workbench hosts.
workspace