Good day.

There is a simple struct:

struct User {
    long id;
    string family;
    string name;
    string surname;
    bool active;
    string login;
    string password;
    RoleEnum role;
}

enum RoleEnum { admin = 1, user };

I want to fill this struct from web form:

section(class="wrap-form")
        form(action="user", method="POST", class="user-form")
            div(class="field")
                label(for="family") Family
                input(type="text", name="family", id="family", value="#{user.family}")
            div(class="field")
                label(for="name") Name
                input(type="text", name="name", id="name", value="#{user.name}")
            div(class="field")
                label(for="surname") Surname
                input(type="text", name="surname", id="surname", value="#{user.surname}")
            div(class="field")
                label(for="active") Is active?
                - if (user.active)
                    input(type="checkbox", name="active", id="active", checked)
                - else
                    input(type="checkbox", name="active", id="active")
            div(class="field")
                label(for="login") Login
                input(type="text", name="login", id="login", value="#{user.login}")
            div(class="field")
                label(for="role") Role
                select(size="1", name="role", id="role")
                    - import std.traits : EnumMembers;
                    - import model.user : RoleEnum;
                    - foreach(role; [EnumMembers!RoleEnum])
                        - if (role == user.role)
                            option(selected="true") #{role}
                        - else
                            option #{role}
            input(type="hidden", name="password", value="")
            
            div(class="field")
                button(type="submit") Save

If I use separate fields, it works.

auto router = new URLRouter;
router.registerWebInterface(new UserController);

...

class UserController
...
public void postUser(string family, string name, string surname, string login, bool active, string password, RoleEnum role)

But if I use more convinient form, then compiler produces an error:

public void postUser(User user)

../../../../.dub/packages/vibe-d-0.8.5/vibe-d/web/vibe/web/common.d(889,29): Error: template vibe.web.common.readFormParamRec cannot deduce function from argument types !()(HTTPServerRequest, string, string, bool, NestedNameStyle, ParamError), candidates are:
../../../../.dub/packages/vibe-d-0.8.5/vibe-d/web/vibe/web/common.d(718,21): readFormParamRec(T)(scope HTTPServerRequest req, ref T dst, string fieldname, bool required, NestedNameStyle style, ref ParamError err)
../../../../.dub/packages/vibe-d-0.8.5/vibe-d/web/vibe/web/web.d(956,40): Error: template instance vibe.web.common.readFormParamRec!(User) error instantiating
../../../../.dub/packages/vibe-d-0.8.5/vibe-d/web/vibe/web/web.d(207,34): instantiated from here: handleRequest!("postUser", postUser, UserController)
source/app.d(49,32): instantiated from here: registerWebInterface!(UserController, cast(MethodStyle)5)

What I must to do to use public void postUser(User user) instead of individual parts of struct?

I will be grateful for both the documentation and for the advice.