php_codegen 0.4.0

Generate PHP code from Rust using a fluent API 🐘 🦀
Documentation
use php_codegen::class::Class;
use php_codegen::data_type::DataType;
use php_codegen::file::File;
use php_codegen::literal::Value;
use php_codegen::modifiers::VisibilityModifier;
use php_codegen::property::Property;
use php_codegen::property::PropertyHook;
use php_codegen::property::PropertySetHookParameter;

fn main() {
    let file = File::new()
        .namespaced("App")
        .declare("strict_types", 1)
        // A class that uses property hooks
        .class(
            Class::new("SimpleUser")
                .property(
                    Property::new("firstName")
                        .typed(DataType::String)
                        .visibility(VisibilityModifier::Private)
                        .default(Value::String("Jane".to_string())),
                )
                .property(
                    Property::new("lastName")
                        .typed(DataType::String)
                        .visibility(VisibilityModifier::Private)
                        .default(Value::String("Doe".to_string())),
                )
                .property(
                    Property::new("fullname")
                        .typed(DataType::String)
                        .visibility(VisibilityModifier::Public)
                        .hook(PropertyHook::Get(
                            false,
                            vec!["return $this->firstName . ' ' . $this->lastName;"].into(),
                        ))
                        .hook(PropertyHook::Set(
                            Some(
                                PropertySetHookParameter::new("$fullname").typed(DataType::String),
                            ),
                            vec![
                                "[$first, $last] = explode(' ', $fullname);",
                                "$this->firstName = $first;",
                                "$this->lastName = $last;",
                            ]
                            .into(),
                        )),
                ),
        )
        .class(
            Class::new("SimpleUser2")
                .property(
                    Property::new("firstName")
                        .typed(DataType::String)
                        .visibility(VisibilityModifier::Private)
                        .default(Value::String("Jane".to_string())),
                )
                .property(
                    Property::new("lastName")
                        .typed(DataType::String)
                        .visibility(VisibilityModifier::Private)
                        .default(Value::String("Doe".to_string())),
                )
                .property(
                    Property::new("fullname")
                        .typed(DataType::String)
                        .visibility(VisibilityModifier::Public)
                        .hook(PropertyHook::Get(
                            false,
                            vec!["return $this->firstName . ' ' . $this->lastName;"].into(),
                        )),
                ),
        );

    print!("{file}");
}