# Lucene Query Builder Derive
A procmacro derive crate to generate lucene query builder for Rust structs :
## Usage :
```rust
use lucene_query_builder::QueryBuilder;
#[derive(QueryBuilder)]
struct Person {
name: String,
age: i32,
}
```
### Simple query
```rust
let query = Person::query_builder()
.name("Bob")
.or()
.name("Alice")
.build();
assert_eq!(query, "name:Bob OR name:Alice".to_string());
```
### Nested query
```rust
let query = Person::query_builder()
.expr(Person::query_builder().name("Bob").or().name("Alice"))
.and()
.age("22")
.build();
assert_eq!(
query,
"(name:Bob OR name:Alice) AND age:22".to_string()
);
```
### Range query
```rust
let query = Person::query_builder().age_range("7", "77").build();
assert_eq!(query, "age:[7 TO 77]".to_string());
```
### Rename builder functions and field names
Use `#[query_builder_rename = "name"]` if you need to rename the generated method :
```rust
#[derive(QueryBuilder)]
struct Person {
name: String,
age: i32,
#[query_builder_rename = "fullname"]
complete_name: String,
}
```
```rust
let query = Person::query_builder()
.name("Bob")
.and()
.fullname("Bob Marley")
.build();
assert_eq!(
query,
"name:Bob AND complete_name:\"Bob Marley\"".to_string()
);
```
If you need to rename the generated lucene field you can use `#[query_builder_field = "name"]. `
```rust
#[derive(QueryBuilder)]
struct Person {
name: String,
age: i32,
#[query_builder_rename = "fullname"]
#[query_builder_field = "fullname"]
complete_name: String,
}
```
```rust
let query = Person::query_builder()
.name("Bob")
.and()
.fullname("Bob Marley")
.build();
assert_eq!(
query,
"name:Bob AND fullname:\"Bob Marley\"".to_string()
);
```
### Ignore fields
If you need to ignore a field use the attribute macro : `#[query_builder_ignore]`