pasta_core 0.2.3

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 統合テスト

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 テスト用固定選択実装

使用例

Note: DSLのパースは pasta_dsl クレートを使用してください。

シーンテーブルの構築と検索

use std::collections::HashMap;
use pasta_core::registry::{SceneRegistry, SceneTable, DefaultRandomSelector};

// Pass 1: トランスパイル時にシーンを登録
let mut registry = SceneRegistry::new();
registry.register_global("挨拶", HashMap::new());

// Runtime: SceneTable へ変換して前方一致検索
let mut table = SceneTable::from_scene_registry(
    registry,
    Box::new(DefaultRandomSelector::new()),
).unwrap();

let scene_id = table.resolve_scene_id("挨拶", &HashMap::new()).unwrap();
let scene = table.get_scene(scene_id).unwrap();
println!("Selected: {}", scene.fn_name);

単語テーブルの構築と検索

use pasta_core::registry::{WordDefRegistry, WordTable, DefaultRandomSelector};

// Pass 1: 単語定義を登録
let mut registry = WordDefRegistry::new();
registry.register_global("挨拶", vec!["こんにちは".to_string(), "おはよう".to_string()]);

// Runtime: WordTable へ変換してランダム選択(同一キーは循環消費)
let mut table = WordTable::from_word_def_registry(
    registry,
    Box::new(DefaultRandomSelector::new()),
);
let word = table.search_word("", "挨拶", &[]).unwrap();
println!("Selected: {}", word);

依存関係

クレート バージョン 用途
thiserror 2 エラー型定義
fast_radix_trie 1.2.0 前方一致検索(SceneTable)
rand 0.10 ランダム選択

関連クレート

ライセンス

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