use schemars::JsonSchema;
use serde::Deserialize;
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ListToolParams {
pub filter: Option<String>,
pub search: Option<String>,
pub sort: Option<String>,
pub per_page: Option<u32>,
pub page: Option<u32>,
pub cursor: Option<String>,
pub sample: Option<u32>,
pub seed: Option<u32>,
pub select: Option<String>,
pub group_by: Option<String>,
}
impl ListToolParams {
pub fn into_list_params(self) -> papers_core::ListParams {
papers_core::ListParams {
filter: self.filter,
search: self.search,
sort: self.sort,
per_page: self.per_page,
page: self.page,
cursor: self.cursor,
sample: self.sample,
seed: self.seed,
select: self.select,
group_by: self.group_by,
}
}
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct WorkListToolParams {
pub filter: Option<String>,
pub search: Option<String>,
pub sort: Option<String>,
pub per_page: Option<u32>,
pub page: Option<u32>,
pub cursor: Option<String>,
pub sample: Option<u32>,
pub seed: Option<u32>,
pub select: Option<String>,
pub group_by: Option<String>,
pub author: Option<String>,
pub topic: Option<String>,
pub domain: Option<String>,
pub field: Option<String>,
pub subfield: Option<String>,
pub publisher: Option<String>,
pub source: Option<String>,
pub institution: Option<String>,
pub year: Option<String>,
pub citations: Option<String>,
pub country: Option<String>,
pub continent: Option<String>,
pub r#type: Option<String>,
pub open: Option<bool>,
}
impl WorkListToolParams {
pub fn into_work_list_params(&self) -> papers_core::WorkListParams {
papers_core::WorkListParams {
filter: self.filter.clone(),
search: self.search.clone(),
sort: self.sort.clone(),
per_page: self.per_page,
page: self.page,
cursor: self.cursor.clone(),
sample: self.sample,
seed: self.seed,
select: self.select.clone(),
group_by: self.group_by.clone(),
author: self.author.clone(),
topic: self.topic.clone(),
domain: self.domain.clone(),
field: self.field.clone(),
subfield: self.subfield.clone(),
publisher: self.publisher.clone(),
source: self.source.clone(),
institution: self.institution.clone(),
year: self.year.clone(),
citations: self.citations.clone(),
country: self.country.clone(),
continent: self.continent.clone(),
r#type: self.r#type.clone(),
open: self.open,
}
}
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct AuthorListToolParams {
pub filter: Option<String>,
pub search: Option<String>,
pub sort: Option<String>,
pub per_page: Option<u32>,
pub page: Option<u32>,
pub cursor: Option<String>,
pub sample: Option<u32>,
pub seed: Option<u32>,
pub select: Option<String>,
pub group_by: Option<String>,
pub institution: Option<String>,
pub country: Option<String>,
pub continent: Option<String>,
pub citations: Option<String>,
pub works: Option<String>,
pub h_index: Option<String>,
}
impl AuthorListToolParams {
pub fn into_entity_params(&self) -> papers_core::AuthorListParams {
papers_core::AuthorListParams {
filter: self.filter.clone(),
search: self.search.clone(),
sort: self.sort.clone(),
per_page: self.per_page,
page: self.page,
cursor: self.cursor.clone(),
sample: self.sample,
seed: self.seed,
select: self.select.clone(),
group_by: self.group_by.clone(),
institution: self.institution.clone(),
country: self.country.clone(),
continent: self.continent.clone(),
citations: self.citations.clone(),
works: self.works.clone(),
h_index: self.h_index.clone(),
}
}
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct SourceListToolParams {
pub filter: Option<String>,
pub search: Option<String>,
pub sort: Option<String>,
pub per_page: Option<u32>,
pub page: Option<u32>,
pub cursor: Option<String>,
pub sample: Option<u32>,
pub seed: Option<u32>,
pub select: Option<String>,
pub group_by: Option<String>,
pub publisher: Option<String>,
pub country: Option<String>,
pub continent: Option<String>,
pub r#type: Option<String>,
pub open: Option<bool>,
pub citations: Option<String>,
pub works: Option<String>,
}
impl SourceListToolParams {
pub fn into_entity_params(&self) -> papers_core::SourceListParams {
papers_core::SourceListParams {
filter: self.filter.clone(),
search: self.search.clone(),
sort: self.sort.clone(),
per_page: self.per_page,
page: self.page,
cursor: self.cursor.clone(),
sample: self.sample,
seed: self.seed,
select: self.select.clone(),
group_by: self.group_by.clone(),
publisher: self.publisher.clone(),
country: self.country.clone(),
continent: self.continent.clone(),
r#type: self.r#type.clone(),
open: self.open,
citations: self.citations.clone(),
works: self.works.clone(),
}
}
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct InstitutionListToolParams {
pub filter: Option<String>,
pub search: Option<String>,
pub sort: Option<String>,
pub per_page: Option<u32>,
pub page: Option<u32>,
pub cursor: Option<String>,
pub sample: Option<u32>,
pub seed: Option<u32>,
pub select: Option<String>,
pub group_by: Option<String>,
pub country: Option<String>,
pub continent: Option<String>,
pub r#type: Option<String>,
pub citations: Option<String>,
pub works: Option<String>,
}
impl InstitutionListToolParams {
pub fn into_entity_params(&self) -> papers_core::InstitutionListParams {
papers_core::InstitutionListParams {
filter: self.filter.clone(),
search: self.search.clone(),
sort: self.sort.clone(),
per_page: self.per_page,
page: self.page,
cursor: self.cursor.clone(),
sample: self.sample,
seed: self.seed,
select: self.select.clone(),
group_by: self.group_by.clone(),
country: self.country.clone(),
continent: self.continent.clone(),
r#type: self.r#type.clone(),
citations: self.citations.clone(),
works: self.works.clone(),
}
}
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct TopicListToolParams {
pub filter: Option<String>,
pub search: Option<String>,
pub sort: Option<String>,
pub per_page: Option<u32>,
pub page: Option<u32>,
pub cursor: Option<String>,
pub sample: Option<u32>,
pub seed: Option<u32>,
pub select: Option<String>,
pub group_by: Option<String>,
pub domain: Option<String>,
pub field: Option<String>,
pub subfield: Option<String>,
pub citations: Option<String>,
pub works: Option<String>,
}
impl TopicListToolParams {
pub fn into_entity_params(&self) -> papers_core::TopicListParams {
papers_core::TopicListParams {
filter: self.filter.clone(),
search: self.search.clone(),
sort: self.sort.clone(),
per_page: self.per_page,
page: self.page,
cursor: self.cursor.clone(),
sample: self.sample,
seed: self.seed,
select: self.select.clone(),
group_by: self.group_by.clone(),
domain: self.domain.clone(),
field: self.field.clone(),
subfield: self.subfield.clone(),
citations: self.citations.clone(),
works: self.works.clone(),
}
}
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct PublisherListToolParams {
pub filter: Option<String>,
pub search: Option<String>,
pub sort: Option<String>,
pub per_page: Option<u32>,
pub page: Option<u32>,
pub cursor: Option<String>,
pub sample: Option<u32>,
pub seed: Option<u32>,
pub select: Option<String>,
pub group_by: Option<String>,
pub country: Option<String>,
pub continent: Option<String>,
pub citations: Option<String>,
pub works: Option<String>,
}
impl PublisherListToolParams {
pub fn into_entity_params(&self) -> papers_core::PublisherListParams {
papers_core::PublisherListParams {
filter: self.filter.clone(),
search: self.search.clone(),
sort: self.sort.clone(),
per_page: self.per_page,
page: self.page,
cursor: self.cursor.clone(),
sample: self.sample,
seed: self.seed,
select: self.select.clone(),
group_by: self.group_by.clone(),
country: self.country.clone(),
continent: self.continent.clone(),
citations: self.citations.clone(),
works: self.works.clone(),
}
}
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct FunderListToolParams {
pub filter: Option<String>,
pub search: Option<String>,
pub sort: Option<String>,
pub per_page: Option<u32>,
pub page: Option<u32>,
pub cursor: Option<String>,
pub sample: Option<u32>,
pub seed: Option<u32>,
pub select: Option<String>,
pub group_by: Option<String>,
pub country: Option<String>,
pub continent: Option<String>,
pub citations: Option<String>,
pub works: Option<String>,
}
impl FunderListToolParams {
pub fn into_entity_params(&self) -> papers_core::FunderListParams {
papers_core::FunderListParams {
filter: self.filter.clone(),
search: self.search.clone(),
sort: self.sort.clone(),
per_page: self.per_page,
page: self.page,
cursor: self.cursor.clone(),
sample: self.sample,
seed: self.seed,
select: self.select.clone(),
group_by: self.group_by.clone(),
country: self.country.clone(),
continent: self.continent.clone(),
citations: self.citations.clone(),
works: self.works.clone(),
}
}
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct DomainListToolParams {
pub filter: Option<String>,
pub search: Option<String>,
pub sort: Option<String>,
pub per_page: Option<u32>,
pub page: Option<u32>,
pub cursor: Option<String>,
pub sample: Option<u32>,
pub seed: Option<u32>,
pub select: Option<String>,
pub group_by: Option<String>,
pub works: Option<String>,
}
impl DomainListToolParams {
pub fn into_entity_params(&self) -> papers_core::DomainListParams {
papers_core::DomainListParams {
filter: self.filter.clone(),
search: self.search.clone(),
sort: self.sort.clone(),
per_page: self.per_page,
page: self.page,
cursor: self.cursor.clone(),
sample: self.sample,
seed: self.seed,
select: self.select.clone(),
group_by: self.group_by.clone(),
works: self.works.clone(),
}
}
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct FieldListToolParams {
pub filter: Option<String>,
pub search: Option<String>,
pub sort: Option<String>,
pub per_page: Option<u32>,
pub page: Option<u32>,
pub cursor: Option<String>,
pub sample: Option<u32>,
pub seed: Option<u32>,
pub select: Option<String>,
pub group_by: Option<String>,
pub domain: Option<String>,
pub works: Option<String>,
}
impl FieldListToolParams {
pub fn into_entity_params(&self) -> papers_core::FieldListParams {
papers_core::FieldListParams {
filter: self.filter.clone(),
search: self.search.clone(),
sort: self.sort.clone(),
per_page: self.per_page,
page: self.page,
cursor: self.cursor.clone(),
sample: self.sample,
seed: self.seed,
select: self.select.clone(),
group_by: self.group_by.clone(),
domain: self.domain.clone(),
works: self.works.clone(),
}
}
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct SubfieldListToolParams {
pub filter: Option<String>,
pub search: Option<String>,
pub sort: Option<String>,
pub per_page: Option<u32>,
pub page: Option<u32>,
pub cursor: Option<String>,
pub sample: Option<u32>,
pub seed: Option<u32>,
pub select: Option<String>,
pub group_by: Option<String>,
pub domain: Option<String>,
pub field: Option<String>,
pub works: Option<String>,
}
impl SubfieldListToolParams {
pub fn into_entity_params(&self) -> papers_core::SubfieldListParams {
papers_core::SubfieldListParams {
filter: self.filter.clone(),
search: self.search.clone(),
sort: self.sort.clone(),
per_page: self.per_page,
page: self.page,
cursor: self.cursor.clone(),
sample: self.sample,
seed: self.seed,
select: self.select.clone(),
group_by: self.group_by.clone(),
domain: self.domain.clone(),
field: self.field.clone(),
works: self.works.clone(),
}
}
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct WorkTextToolParams {
pub id: String,
pub advanced: Option<String>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct GetToolParams {
pub id: String,
pub select: Option<String>,
}
impl GetToolParams {
pub fn into_get_params(&self) -> papers_core::GetParams {
papers_core::GetParams {
select: self.select.clone(),
}
}
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct AutocompleteToolParams {
pub q: String,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct FindWorksToolParams {
pub query: String,
pub count: Option<u32>,
pub filter: Option<String>,
}
impl FindWorksToolParams {
pub fn into_find_params(self) -> papers_core::FindWorksParams {
papers_core::FindWorksParams {
query: self.query,
count: self.count,
filter: self.filter,
}
}
}
fn lax_optional_u32<'de, D>(d: D) -> Result<Option<u32>, D::Error>
where
D: serde::Deserializer<'de>,
{
#[derive(serde::Deserialize)]
#[serde(untagged)]
enum Lax {
Int(u32),
Str(String),
}
match Option::<Lax>::deserialize(d)? {
None => Ok(None),
Some(Lax::Int(n)) => Ok(Some(n)),
Some(Lax::Str(s)) if s.is_empty() => Ok(None),
Some(Lax::Str(s)) => s.parse::<u32>().map(Some).map_err(serde::de::Error::custom),
}
}
fn lax_optional_u64<'de, D>(d: D) -> Result<Option<u64>, D::Error>
where
D: serde::Deserializer<'de>,
{
#[derive(serde::Deserialize)]
#[serde(untagged)]
enum Lax {
Int(u64),
Str(String),
}
match Option::<Lax>::deserialize(d)? {
None => Ok(None),
Some(Lax::Int(n)) => Ok(Some(n)),
Some(Lax::Str(s)) if s.is_empty() => Ok(None),
Some(Lax::Str(s)) => s.parse::<u64>().map(Some).map_err(serde::de::Error::custom),
}
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroWorkListToolParams {
pub search: Option<String>,
#[serde(default)]
pub everything: bool,
pub tag: Option<String>,
pub item_type: Option<String>,
pub item_key: Option<String>,
#[serde(default, deserialize_with = "lax_optional_u64")]
pub since: Option<u64>,
pub sort: Option<String>,
pub direction: Option<String>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub limit: Option<u32>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub start: Option<u32>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroWorkChildrenToolParams {
pub key: String,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub limit: Option<u32>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub start: Option<u32>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroWorkTagsToolParams {
pub key: String,
pub search: Option<String>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub limit: Option<u32>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub start: Option<u32>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroAttachmentListToolParams {
pub search: Option<String>,
pub sort: Option<String>,
pub direction: Option<String>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub limit: Option<u32>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub start: Option<u32>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroAnnotationListToolParams {
#[serde(default, deserialize_with = "lax_optional_u32")]
pub limit: Option<u32>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub start: Option<u32>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroNoteListToolParams {
pub search: Option<String>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub limit: Option<u32>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub start: Option<u32>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroCollectionListToolParams {
pub sort: Option<String>,
pub direction: Option<String>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub limit: Option<u32>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub start: Option<u32>,
pub scope: Option<String>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroCollectionWorksToolParams {
pub key: String,
pub search: Option<String>,
#[serde(default)]
pub everything: bool,
pub tag: Option<String>,
pub item_type: Option<String>,
pub sort: Option<String>,
pub direction: Option<String>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub limit: Option<u32>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub start: Option<u32>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroCollectionNotesToolParams {
pub key: String,
pub search: Option<String>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub limit: Option<u32>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub start: Option<u32>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroCollectionSubcollectionsToolParams {
pub key: String,
pub sort: Option<String>,
pub direction: Option<String>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub limit: Option<u32>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub start: Option<u32>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroCollectionTagsToolParams {
pub key: String,
pub search: Option<String>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub limit: Option<u32>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub start: Option<u32>,
pub top: Option<bool>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroTagListToolParams {
pub search: Option<String>,
pub sort: Option<String>,
pub direction: Option<String>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub limit: Option<u32>,
#[serde(default, deserialize_with = "lax_optional_u32")]
pub start: Option<u32>,
pub scope: Option<String>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroKeyToolParams {
pub key: String,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroTagGetToolParams {
pub name: String,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroNoParamsToolParams {}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroDeletedListToolParams {
#[serde(default, deserialize_with = "lax_optional_u64")]
pub since: Option<u64>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ZoteroSettingGetToolParams {
pub key: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_list_params_conversion() {
let tool_params = ListToolParams {
filter: Some("is_oa:true".into()),
search: Some("machine learning".into()),
sort: Some("cited_by_count:desc".into()),
per_page: Some(10),
page: Some(2),
cursor: None,
sample: None,
seed: None,
select: Some("id,display_name".into()),
group_by: Some("type".into()),
};
let params = tool_params.into_list_params();
assert_eq!(params.filter.as_deref(), Some("is_oa:true"));
assert_eq!(params.search.as_deref(), Some("machine learning"));
assert_eq!(params.sort.as_deref(), Some("cited_by_count:desc"));
assert_eq!(params.per_page, Some(10));
assert_eq!(params.page, Some(2));
assert!(params.cursor.is_none());
assert_eq!(params.select.as_deref(), Some("id,display_name"));
assert_eq!(params.group_by.as_deref(), Some("type"));
}
#[test]
fn test_get_params_conversion() {
let tool_params = GetToolParams {
id: "W2741809807".into(),
select: Some("id,title".into()),
};
let params = tool_params.into_get_params();
assert_eq!(params.select.as_deref(), Some("id,title"));
}
#[test]
fn test_find_params_conversion() {
let tool_params = FindWorksToolParams {
query: "drug discovery".into(),
count: Some(10),
filter: Some("publication_year:>2020".into()),
};
let params = tool_params.into_find_params();
assert_eq!(params.query, "drug discovery");
assert_eq!(params.count, Some(10));
assert_eq!(params.filter.as_deref(), Some("publication_year:>2020"));
}
#[test]
fn test_default_values() {
let json = r#"{}"#;
let params: ListToolParams = serde_json::from_str(json).unwrap();
assert!(params.filter.is_none());
assert!(params.search.is_none());
assert!(params.sort.is_none());
assert!(params.per_page.is_none());
assert!(params.page.is_none());
assert!(params.cursor.is_none());
assert!(params.sample.is_none());
assert!(params.seed.is_none());
assert!(params.select.is_none());
assert!(params.group_by.is_none());
}
#[test]
fn test_list_params_schema() {
let schema = schemars::schema_for!(ListToolParams);
let json = serde_json::to_value(&schema).unwrap();
assert_eq!(json["type"], "object");
let props = json["properties"].as_object().unwrap();
assert!(props.contains_key("filter"));
assert!(props.contains_key("search"));
assert!(props.contains_key("sort"));
assert!(props.contains_key("per_page"));
}
#[test]
fn test_work_list_params_conversion_with_new_fields() {
let tool_params: WorkListToolParams = serde_json::from_value(serde_json::json!({
"institution": "mit",
"country": "US",
"continent": "north america",
"type": "article",
"open": true,
"year": "2024"
})).unwrap();
let params = tool_params.into_work_list_params();
assert_eq!(params.institution.as_deref(), Some("mit"));
assert_eq!(params.country.as_deref(), Some("US"));
assert_eq!(params.continent.as_deref(), Some("north america"));
assert_eq!(params.r#type.as_deref(), Some("article"));
assert_eq!(params.open, Some(true));
assert_eq!(params.year.as_deref(), Some("2024"));
}
#[test]
fn test_author_list_params_conversion() {
let tool_params: AuthorListToolParams = serde_json::from_value(serde_json::json!({
"institution": "harvard",
"country": "US",
"citations": ">1000",
"h_index": ">50"
})).unwrap();
let params = tool_params.into_entity_params();
assert_eq!(params.institution.as_deref(), Some("harvard"));
assert_eq!(params.country.as_deref(), Some("US"));
assert_eq!(params.citations.as_deref(), Some(">1000"));
assert_eq!(params.h_index.as_deref(), Some(">50"));
}
#[test]
fn test_source_list_params_conversion() {
let tool_params: SourceListToolParams = serde_json::from_value(serde_json::json!({
"publisher": "springer",
"type": "journal",
"open": true
})).unwrap();
let params = tool_params.into_entity_params();
assert_eq!(params.publisher.as_deref(), Some("springer"));
assert_eq!(params.r#type.as_deref(), Some("journal"));
assert_eq!(params.open, Some(true));
}
#[test]
fn test_topic_list_params_conversion() {
let tool_params: TopicListToolParams = serde_json::from_value(serde_json::json!({
"domain": "3",
"field": "17"
})).unwrap();
let params = tool_params.into_entity_params();
assert_eq!(params.domain.as_deref(), Some("3"));
assert_eq!(params.field.as_deref(), Some("17"));
}
#[test]
fn test_institution_list_params_conversion() {
let tool_params: InstitutionListToolParams = serde_json::from_value(serde_json::json!({
"country": "US",
"type": "education",
"works": ">100000"
})).unwrap();
let params = tool_params.into_entity_params();
assert_eq!(params.country.as_deref(), Some("US"));
assert_eq!(params.r#type.as_deref(), Some("education"));
assert_eq!(params.works.as_deref(), Some(">100000"));
}
#[test]
fn test_subfield_list_params_conversion() {
let tool_params: SubfieldListToolParams = serde_json::from_value(serde_json::json!({
"domain": "3",
"field": "17",
"works": ">1000000"
})).unwrap();
let params = tool_params.into_entity_params();
assert_eq!(params.domain.as_deref(), Some("3"));
assert_eq!(params.field.as_deref(), Some("17"));
assert_eq!(params.works.as_deref(), Some(">1000000"));
}
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct SelectionListToolParams {}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct SelectionGetToolParams {
pub name: Option<String>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct SelectionCreateToolParams {
pub name: String,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct SelectionDeleteToolParams {
pub name: String,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct SelectionAddToolParams {
pub paper: String,
pub selection: Option<String>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct SelectionRemoveToolParams {
pub paper: String,
pub selection: Option<String>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct SearchToolParams {
pub query: String,
pub selection: Option<String>,
pub paper_id: Option<String>,
pub chapter_idx: Option<u16>,
pub section_idx: Option<u16>,
pub filter_year_min: Option<u16>,
pub filter_year_max: Option<u16>,
pub filter_venue: Option<String>,
pub filter_tags: Option<Vec<String>>,
pub filter_depth: Option<String>,
pub limit: Option<u16>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct SearchFiguresToolParams {
pub query: String,
pub selection: Option<String>,
pub paper_id: Option<String>,
pub filter_figure_type: Option<String>,
pub limit: Option<u16>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct GetChunkToolParams {
pub chunk_id: String,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct GetSectionToolParams {
pub paper_id: String,
pub chapter_idx: u16,
pub section_idx: u16,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct GetChapterToolParams {
pub paper_id: String,
pub chapter_idx: u16,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct GetFigureToolParams {
pub figure_id: String,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct GetPaperOutlineToolParams {
pub paper_id: String,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ListPapersToolParams {
pub selection: Option<String>,
pub filter_year_min: Option<u16>,
pub filter_year_max: Option<u16>,
pub filter_venue: Option<String>,
pub filter_tags: Option<Vec<String>>,
pub filter_authors: Option<Vec<String>>,
pub sort_by: Option<String>,
pub limit: Option<u16>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ListTagsToolParams {
pub selection: Option<String>,
}