Skip to content
This repository was archived by the owner on Feb 6, 2025. It is now read-only.
This repository was archived by the owner on Feb 6, 2025. It is now read-only.

Move to Reactive Extensions #134

@Horusiath

Description

@Horusiath

I've already proposed this in person, but I've decided to move forward and describe a little more.

I think, that Rx.NET proposes a nifty API for a problem, that Warden aims to solve. Given watchers and hooks for example - first one seems to be used to define a source of some events happening over time, we'd like to monitor and make assertions agains, while the second is a subscriber (observer) of such stream of events.

As example, following config:

var configuration = WardenConfiguration
    .Create()
    .AddWebWatcher(WebWatcherConfiguration.Create("http://some.url")
        .EnsureThat(response => response.StatusCode == HttpStatusCode.OK)
        .Build(),
        hooks: hooks =>
        {
            hooks.OnFirstFailure(result => Console.WriteLine("Response was not HTTP OK"));
        },
        interval: TimeSpan.FromSeconds(5));

is roughly equivalent of:

Observable
    .Timer(dueTime: TimeSpan.FromSeconds(5), period: TimeSpan.FromSeconds(5))
    .SelectMany(async _ => await HttpGet("http://some.url"))
    .Where(response => response.StatusCode != HttpStatusCode.OK)
    .Take(1)
    .Subscribe(onNext: nonOkResponse => Console.WriteLine("Response was not HTTP Ok"));

Take note, that Observable has over 100 extension methods, many of them familiar for people already using LINQ. They are also highly composable. That's a lot of code you don't need to write or maintain.

Also Rx.NET comes with a scheduler that is able to handle things like periodic action runs etc.

If you're interested this is a starting point. From there you could move further into concept of reactive streams.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions