# Timestamp generators

If you want to generate timestamps on the client side you can provide
a TimestampGenerator to a SessionBuilder when creating a Session. Then
every executed statement will have attached a new timestamp generated
by the provided TimestampGenerator.
Timestamps are set according to precendence:

1. `USING TIMESTAMP` in the statement string itself
2. Manually using `set_timestamp` on the statement
3. Timestamp generated by the generator

## Simple Timestamp Generator

Most basic client-side timestamp generator. Generates timestamp
based on system clock. Provides no guarantees and panics when the system clock
provides timestamp before the unix epoch.

## Monotonic Timestamp Generator

Client-side timestamp generator. Guarantees monotonic timestamps
based on the system clock, with automatic timestamp incrementation
if the system clock timestamp would not be monotonic. If the clock skew
exceeds `warning_threshold` of the generator (can be changed with `with_warning_times`, 1s by default)
user will be warned with timestamp generation with `warning_interval` cooldown period
(can be changed with `with_warning_times`, 1s by default) to not spam the user. If user does not want to
be warned about the clock skew, the warnings can be turned off with `without_warnings` function.

```rust
# extern crate scylla;
# use std::error::Error;
# async fn check_only_compiles() -> Result<(), Box<dyn std::error::Error>> {
use scylla::client::session::Session;
use scylla::client::session_builder::SessionBuilder;
use scylla::policies::timestamp_generator::MonotonicTimestampGenerator;
use scylla::statement::unprepared::Statement;
use std::sync::Arc;

let session: Session = SessionBuilder::new()
    .known_node("127.0.0.1:9042")
    .timestamp_generator(Arc::new(MonotonicTimestampGenerator::new()))
    .build()
    .await?;

// This statement will have a timestamp generated 
// by the monotonic timestamp generator
let my_statement: Statement = Statement::new("INSERT INTO ks.tab (a) VALUES(?)");
let to_insert: i32 = 12345;
session.query_unpaged(my_statement, (to_insert,)).await?;
# Ok(())
# }
```
