New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move to Reactive Extensions #134

Open
Horusiath opened this Issue Dec 16, 2016 · 1 comment

Comments

Projects
None yet
2 participants
@Horusiath

Horusiath commented Dec 16, 2016

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.

@spetz

This comment has been minimized.

Show comment
Hide comment
@spetz

spetz Dec 16, 2016

Member

Thanks, it's a very interesting idea indeed. I have a little experience with RX and even less time to re-implement the library itself but it looks very neat. I'll take a look at the provided resources and if you would like to give it a try by implementing a simple extension using RX that would be great :).

Member

spetz commented Dec 16, 2016

Thanks, it's a very interesting idea indeed. I have a little experience with RX and even less time to re-implement the library itself but it looks very neat. I'll take a look at the provided resources and if you would like to give it a try by implementing a simple extension using RX that would be great :).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment