Skip to content

Guide Advanced

GitHub Actions edited this page Jan 25, 2026 · 2 revisions

Erweiterte Themen in VelinScript

VelinScript ist mehr als nur eine Sprache fΓΌr Web-APIs. Sie bietet mΓ€chtige Werkzeuge fΓΌr Systemprogrammierung, Modularisierung und Erweiterbarkeit. Dieses Handbuch richtet sich an fortgeschrittene Entwickler, die das volle Potenzial der Plattform ausschΓΆpfen mΓΆchten.


Inhaltsverzeichnis

  1. Das Modulsystem
  2. CLI & Systemprozesse (process Modul)
  3. Plugin-Entwicklung
  4. Paketmanagement mit velin.toml

1. Das Modulsystem

VelinScript verwendet ein modernes, dateibasiertes Modulsystem, das stark von Rust und Python inspiriert ist. Es fΓΆrdert Kapselung und Wiederverwendbarkeit.

Dateien als Module

Jede .velin-Datei ist implizit ein Modul. Der Name der Datei (ohne Endung) ist der Modulname.

Dateistruktur:

src/
  main.velin
  utils.velin
  models/
    user.velin

Verwendung in main.velin:

use utils
use models::user

fn main() {
    utils.helper();
    let u = user.User { ... };
}

Explizite Sub-Module

Sie kΓΆnnen Module auch innerhalb einer Datei definieren, um logische Gruppen zu bilden, ohne neue Dateien anzulegen.

// Datei: math_utils.velin

// Privates Modul (nur in dieser Datei sichtbar)
mod internal {
    fn helper() { ... }
}

// Γ–ffentliches Modul
pub mod geometry {
    pub struct Point { x: number, y: number }

    pub fn distance(p1: Point, p2: Point): number {
        return math.sqrt(math.pow(p2.x - p1.x, 2) + ...);
    }
}

Sichtbarkeit (pub)

StandardmÀßig ist alles in VelinScript privat (nur im aktuellen Modul sichtbar). Um Funktionen, Structs oder Konstanten nach außen freizugeben, nutzen Sie das pub-Keyword.

// Nur hier sichtbar
fn secretHelper() {}

// Von ΓΌberall sichtbar, wo das Modul importiert wird
pub fn publicApi() {
    secretHelper(); // Interner Zugriff erlaubt
}

pub struct Config {
    pub host: string, // Feld ist ΓΆffentlich
    apiKey: string    // Feld ist privat (nur ΓΌber Methoden zugreifbar)
}

Re-Exporting

Sie kΓΆnnen Typen aus Untermodulen "hochziehen", um eine sauberere API zu bieten.

// Datei: api/mod.velin
use api::users
use api::products

// Nutzer mΓΌssen nicht 'api::users::User' schreiben, sondern nur 'api::User'
pub use users::User
pub use products::Product

2. CLI & Systemprozesse (process Modul)

VelinScript eignet sich hervorragend als Ersatz fΓΌr Bash- oder Python-Skripte im DevOps-Bereich.

Externe Befehle ausfΓΌhren

Nutzen Sie process.spawn, um Systembefehle auszufΓΌhren.

use process

fn backupDatabase() {
    log.info("Starte Backup...");
    
    // FΓΌhrt 'pg_dump' aus
    let output = process.spawn("pg_dump", [
        "-U", "postgres",
        "-f", "./backup.sql",
        "my_database"
    ]);

    if (output.exitCode == 0) {
        log.info("Backup erfolgreich!");
    } else {
        log.error("Backup fehlgeschlagen: " + output.stderr);
        throw Error("Backup Failed");
    }
}

Prozessmanagement und Überwachung

Sie kΓΆnnen laufende Prozesse ΓΌberwachen und steuern.

fn ensureServiceRunning(serviceName: string) {
    if (process.is_running(serviceName)) {
        let mem = process.get_memory(serviceName); // in MB
        log.info(serviceName + " lΓ€uft (RAM: " + mem + "MB)");
        
        if (mem > 1024) {
            log.warn("Speicherleck erkannt, starte neu...");
            process.restart(serviceName);
        }
    } else {
        log.warn(serviceName + " ist down. Starte...");
        process.spawn("systemctl", ["start", serviceName]);
    }
}

Interaktive CLIs bauen

VelinScript kann Benutzereingaben lesen und farbige Ausgaben erzeugen.

use console

fn main() {
    console.print("Willkommen zum Setup-Wizard!", "green");
    
    let name = console.prompt("Wie heißt dein Projekt?");
    let type = console.select("Projekttyp wΓ€hlen:", ["API", "CLI", "Web"]);
    
    if (console.confirm("Soll ich 'git init' ausfΓΌhren?")) {
        process.spawn("git", ["init"]);
    }
    
    console.print("Fertig!", "bold");
}

3. Plugin-Entwicklung

Die Plugin-Architektur erlaubt es, VelinScript-Anwendungen zur Laufzeit zu erweitern, ohne den Kern neu zu kompilieren. Plugins sind kompilierte .vplugin-Dateien (Shared Libraries).

Architektur eines Plugins

Ein Plugin muss das Plugin-Trait implementieren.

// Datei: my_plugin.velin

struct MyPlugin {
    config: Map<string, any>
}

impl Plugin for MyPlugin {
    // Wird beim Laden aufgerufen
    fn on_load(ctx: PluginContext) {
        log.info("Plugin wird initialisiert...");
        
        // Hooks registrieren
        ctx.register_hook("on_request", |req| {
            log.info("Request empfangen: " + req.path);
        });
        
        // Eigene Befehle hinzufΓΌgen
        ctx.register_command("hello", || log.info("Hallo vom Plugin!"));
    }
    
    // Wird beim Entladen (oder Shutdown) aufgerufen
    fn on_unload() {
        log.info("Plugin wird gestoppt.");
    }
}

// Export der Factory-Funktion
pub fn create(config: Map<string, any>): Plugin {
    return MyPlugin { config: config };
}

Lifecycle Hooks

Plugins kΓΆnnen sich in verschiedene Phasen der Anwendung einklinken:

  • on_load: Initialisierung.
  • on_config_loaded: Nach dem Laden der Konfiguration.
  • on_server_start: Bevor der HTTP-Server startet.
  • on_request: Middleware-Γ€hnlicher Hook fΓΌr jeden Request.
  • on_error: Globaler Error-Handler.
  • on_unload: Cleanup.

4. Paketmanagement mit velin.toml

Jedes VelinScript-Projekt wird durch eine velin.toml-Datei definiert.

AbhΓ€ngigkeiten verwalten

[package]
name = "my-awesome-app"
version = "1.0.0"
authors = ["Max Mustermann <max@example.com>"]
description = "Eine VelinScript Demo App"

[dependencies]
# Standard-AbhΓ€ngigkeiten aus der Registry
http-server = "1.2.0"
sea-orm = "0.12"

# Git-AbhΓ€ngigkeiten (fΓΌr Private Repos oder Forks)
utils = { git = "https://github.com/velin/utils.git", branch = "dev" }

# Lokale Pfade (fΓΌr Monorepos)
my-shared-lib = { path = "./libs/shared" }

[dev-dependencies]
test-utils = "0.5"

Workspaces

Für große Projekte (Monorepos) kânnen Sie Workspaces definieren, um AbhÀngigkeiten zu teilen und mehrere Pakete gemeinsam zu bauen.

# Root velin.toml
[workspace]
members = [
    "apps/api",
    "apps/worker",
    "libs/shared",
    "libs/database"
]

Eigene Pakete verΓΆffentlichen

  1. Login: velin login
  2. Build & Test: velin test && velin build --release
  3. Publish: velin publish

Ihr Paket ist dann sofort ΓΌber die zentrale Registry verfΓΌgbar.


Ende des Advanced-Guides. Sie haben nun einen tiefen Einblick in die Systemarchitektur von VelinScript.


← ZurΓΌck zur Übersicht

Clone this wiki locally