use-php 0.0.1

Feature-gated facade crate for RustUse PHP primitives.
Documentation
#![cfg(feature = "full")]

use use_php::prelude::{
    ArtisanCommandName, AutoloadPath, ComposerJson, ComposerPackageName, DiagnosticMessage,
    DrupalModuleName, HookCallbackMetadata, HookKind, HookName, HookReference, LaravelRouteName,
    PackagistPackageName, PhpDiagnostic, PhpErrorKind, PhpExtensionKind, PhpExtensionName,
    PhpExtensionRequirement, PhpFullyQualifiedName, PhpIniDirective, PhpIniDirectiveName,
    PhpIniValue, PhpKeyword, PhpNamespacePath, PhpScalarType, PhpSeverity, PhpSymbol,
    PhpTokenCategory, PhpTokenSpan, PhpTokenText, PhpType, PhpTypeName, PhpVersion, Psr4Mapping,
    Psr4Prefix, PsrCategory, PsrMetadata, PsrNumber, PsrStatus, PsrTitle, SymbolKind, SymbolName,
    WordPressBlockJson, WordPressBlockName, WordPressCapability, WordPressPostTypeSlug,
};

#[test]
fn facade_reexports_every_child_crate() -> Result<(), Box<dyn std::error::Error>> {
    let version: PhpVersion = "8.3.2".parse()?;
    let token_text = PhpTokenText::new("$value")?;
    let token_span = PhpTokenSpan::new(0, 6)?;
    let symbol = PhpSymbol::new(SymbolKind::Class, SymbolName::new("ExampleController")?);
    let namespace = PhpNamespacePath::new("App\\Http")?;
    let name = PhpFullyQualifiedName::new("\\App\\Http\\ExampleController")?;
    let php_type = PhpType::named(PhpTypeName::new("App\\Dto\\UserData")?);
    let ini = PhpIniDirective::new(
        PhpIniDirectiveName::new("display_errors")?,
        PhpIniValue::Boolean(true),
    );
    let diagnostic = PhpDiagnostic::new(
        PhpErrorKind::Runtime,
        PhpSeverity::Error,
        DiagnosticMessage::new("Undefined variable")?,
    );
    let mapping = Psr4Mapping::new(Psr4Prefix::new("App\\")?).with_path(AutoloadPath::new("src/")?);
    let composer = ComposerJson::new().with_name(ComposerPackageName::new("acme/demo")?);
    let packagist = PackagistPackageName::new("symfony/console")?;
    let psr = PsrMetadata::new(
        PsrNumber::new(4)?,
        PsrTitle::new("Autoloading Standard")?,
        PsrStatus::Accepted,
        PsrCategory::Autoloading,
    );
    let extension = PhpExtensionRequirement::required(PhpExtensionName::new("mbstring")?)
        .with_kind(PhpExtensionKind::Bundled);
    let post_type = WordPressPostTypeSlug::new("book")?;
    let capability = WordPressCapability::new("edit_posts")?;
    let hook = HookReference::new(HookName::new("init")?, HookKind::Action)
        .with_callback(HookCallbackMetadata::new("register_books"));
    let block = WordPressBlockJson::new(WordPressBlockName::new("acme/book-card")?);
    let drupal = DrupalModuleName::new("book_tools")?;
    let laravel_route = LaravelRouteName::new("books.index")?;
    let artisan = ArtisanCommandName::new("books:sync")?;

    assert_eq!(version.major(), 8);
    assert_eq!(PhpTokenCategory::Variable.as_str(), "variable");
    assert_eq!(token_text.as_str(), "$value");
    assert_eq!(token_span.len(), 6);
    assert_eq!(PhpKeyword::Readonly.as_str(), "readonly");
    assert_eq!(symbol.name().as_str(), "ExampleController");
    assert_eq!(namespace.segments(), vec!["App", "Http"]);
    assert_eq!(name.to_string(), "\\App\\Http\\ExampleController");
    assert_eq!(PhpType::scalar(PhpScalarType::String).to_string(), "string");
    assert_eq!(php_type.to_string(), "App\\Dto\\UserData");
    assert_eq!(ini.to_string(), "display_errors = true");
    assert_eq!(diagnostic.severity(), PhpSeverity::Error);
    assert_eq!(mapping.prefix().as_str(), "App\\");
    assert_eq!(composer.name().expect("name").package(), "demo");
    assert_eq!(packagist.vendor(), "symfony");
    assert_eq!(psr.identifier(), "PSR-4");
    assert!(extension.is_required());
    assert_eq!(post_type.as_str(), "book");
    assert_eq!(capability.as_str(), "edit_posts");
    assert_eq!(hook.name().as_str(), "init");
    assert_eq!(block.name().as_str(), "acme/book-card");
    assert_eq!(drupal.as_str(), "book_tools");
    assert_eq!(laravel_route.as_str(), "books.index");
    assert_eq!(artisan.as_str(), "books:sync");
    Ok(())
}