1

Not really sure why my code fails to compile, the error I am having: Incomplete structured construct at or before this point in expression

let resendErrorsAsync (bus: IBus) (errorQueueName: string) =
async {
    let! errorQueue = bus.Advanced.QueueDeclareAsync(errorQueueName) |> Async.AwaitTask
    let! message = bus.Advanced.GetMessageAsync(errorQueue) |> Async.AwaitTask
    while message <> null do
        let utf8Body = Encoding.UTF8.GetString(message.Body)
        let error = JsonConvert.DeserializeObject<Error>(utf8Body)
        let errorBodyBytes = Encoding.UTF8.GetBytes(error.Message)
        let! exchange = bus.Advanced.ExchangeDeclareAsync(error.Exchange, "topic") |> Async.AwaitTask
        let! message = bus.Advanced.GetMessageAsync(errorQueue) |> Async.AwaitTask
}

It seems to be related to my two async calls in the while loop, not really sure why though.

1 Answer 1

4

You can't end a block with a let!, there has to be a body after it; that's the reason for the syntax error.

The message you're defining on the last line is a different variable to the one tested in the while condition. It seems you want to mutate the message; for that, you have to explicitly create a mutable variable:

let resendErrorsAsync (bus: IBus) (errorQueueName: string) =
    async {
        let! errorQueue = bus.Advanced.QueueDeclareAsync(errorQueueName) |> Async.AwaitTask
        let! msg = bus.Advanced.GetMessageAsync(errorQueue) |> Async.AwaitTask
        let mutable message = msg
        while message <> null do
            let utf8Body = Encoding.UTF8.GetString(message.Body)
            let error = JsonConvert.DeserializeObject<Error>(utf8Body)
            let errorBodyBytes = Encoding.UTF8.GetBytes(error.Message)
            let! exchange = bus.Advanced.ExchangeDeclareAsync(error.Exchange, "topic") |> Async.AwaitTask
            let! msg = bus.Advanced.GetMessageAsync(errorQueue) |> Async.AwaitTask
            message <- msg
    }
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.