Extract a validation chain: the else-if version

The complete source of forAI_validation_chain_before.ek9, compiled by the EK9 compiler. Shown on forAI.html.

#!ek9
defines module site.forAI.validationbefore

  defines class

    User
      authenticated as Boolean: false

      User()
        -> authenticated as Boolean
        this.authenticated :=: authenticated

      isAuthenticated() as pure
        <- rtn as Boolean: authenticated

      default operator ?

    Request
      user as User: User()
      permissions as List of String: List()
      payload as String: String()

      Request()
        ->
          user as User
          permissions as List of String
          payload as String
        this.user: user
        this.permissions: permissions
        this.payload :=: payload

      hasUser() as pure
        <- rtn as Boolean: user?

      user() as pure
        <- rtn as User: user

      hasPermission() as pure
        -> permission as String
        <- rtn as Boolean: permission in permissions

      payload() as pure
        <- rtn as String: payload

      default operator ?

    Response
      message as String: String()

      Response() as pure
        -> message as String
        this.message :=: message

      operator $ as pure
        <- rtn as String: message

      default operator ?

  defines function

    errorResponse() as pure
      -> reason as String
      <- response as Response: Response(reason)

    doProcess() as pure
      -> request as Request
      <- response as Response: Response(`Processed ${request.payload()}`)

    validateAndProcess()
      -> request as Request
      <- response as Response?

      if not request?
        response: errorResponse("Null request")
      else if not request.hasUser()
        response: errorResponse("Missing user")
      else if not request.user().isAuthenticated()
        response: errorResponse("Not authenticated")
      else if not request.hasPermission("write")
        response: errorResponse("No permission")
      else if not request.payload()?
        response: errorResponse("Missing payload")
      else
        response: doProcess(request)

  defines program

    Validate()
      stdout <- Stdout()
      allowed <- Request(user: User(true), permissions: ["write"], payload: "data")
      refused <- Request(user: User(true), permissions: ["read"], payload: "data")
      stdout.println($validateAndProcess(allowed))
      stdout.println($validateAndProcess(refused))

Download forAI_validation_chain_before.ek9

Output

Processed data
No permission