pasta_core 0.1.22

Pasta Core - Language-independent DSL parsing and registry layer
Documentation

pasta_core

Pasta DSL のレジストリとユーティリティを提供する言語非依存層クレートです。

概要

pasta_core は Pasta DSL のシーン/単語テーブル管理を担当します。 DSLパーサーは独立クレート pasta_dsl に分離されており、 本クレートはバックエンド(Lua等)に依存しない純粋なデータ構造を提供します。

アーキテクチャ

pasta_core
├── Registry       # シーン/単語テーブル管理
│   ├── SceneRegistry   # シーン登録(Pass 1)
│   ├── WordDefRegistry # 単語定義登録
│   ├── SceneTable      # シーン検索(Radix Trie)
│   └── WordTable       # 単語検索
└── Error          # テーブルエラー型定義

Note: DSLパーサーは独立クレート pasta_dsl に分離されています。

ディレクトリ構成

pasta_core/
├── Cargo.toml
├── src/
│   ├── lib.rs           # クレートエントリーポイント
│   ├── error.rs         # SceneTableError, WordTableError
│   └── registry/        # 型管理レイヤー
│       ├── mod.rs              # Registry API
│       ├── scene_registry.rs   # SceneRegistry
│       ├── scene_types.rs      # SceneId, SceneScope, SceneInfo(抽出型)
│       ├── word_registry.rs    # WordDefRegistry
│       ├── scene_table.rs      # SceneTable(Radix Trie)
│       ├── scene_table_tests.rs # SceneTable テスト(#[path]属性)
│       ├── word_table.rs       # WordTable
│       └── random.rs           # RandomSelector インターフェース
└── tests/
    ├── word_table_test.rs   # WordTable 統合テスト
    └── scene_table_test.rs  # SceneTable 統合テスト

Note: パーサーモジュール(parser/, grammar.pest)は独立クレート pasta_dsl に移動されました。

公開API

パーサーAPIparse_str, parse_file, AST型)は pasta_dsl クレートに移動されました。

Registry

説明
SceneRegistry シーン登録・管理(Pass 1)
WordDefRegistry 単語定義登録
SceneTable シーン検索(完全一致 + 前方一致)
WordTable 単語検索
SceneEntry シーン情報エントリ
WordEntry 単語情報エントリ

Random

説明
RandomSelector ランダム選択トレイト
DefaultRandomSelector 本番用ランダム実装
MockRandomSelector テスト用固定選択実装

使用例

基本的なパース

// DSLパーサーは pasta_dsl クレートを使用してください
use pasta_dsl::parser::{parse_str, FileItem, PastaFile};

let source = r#"
*挨拶
    Alice:こんにちは
    Bob:やあ!
"#;

let ast = parse_str(source, "example.pasta").unwrap();

// グローバルシーン数をカウント
let scene_count = ast.items.iter()
    .filter(|i| matches!(i, FileItem::GlobalSceneScope(_)))
    .count();
println!("Parsed {} global scenes", scene_count);

シーンテーブルの構築

use pasta_core::registry::{SceneTable, SceneEntry, SceneId, SceneScope, DefaultRandomSelector};

let mut table = SceneTable::new();

// シーンを登録
let entry = SceneEntry {
    id: SceneId(0),
    name: "挨拶".to_string(),
    scope: SceneScope::Global,
    file_path: "example.pasta".to_string(),
};
table.insert(entry);

// 完全一致検索
let selector = DefaultRandomSelector::new();
if let Some(scene) = table.get_exact("挨拶", &selector) {
    println!("Found scene: {:?}", scene);
}

前方一致検索

use pasta_core::registry::{SceneTable, DefaultRandomSelector};

let selector = DefaultRandomSelector::new();
// "挨拶" で始まるすべてのシーンからランダムに1つ選択
if let Some(scene) = table.get_prefix("挨拶", &selector) {
    println!("Selected: {:?}", scene);
}

依存関係

クレート バージョン 用途
thiserror 2 エラー型定義
fast_radix_trie 1.1.0 前方一致検索(SceneTable)
rand 0.9 ランダム選択
tracing 0.1 ロギング・診断

関連クレート

ライセンス

プロジェクトルートの LICENSE ファイルを参照してください。