#![allow(clippy::missing_errors_doc)] #![allow(clippy::missing_const_for_fn)] #![allow(clippy::must_use_candidate)] #![warn(clippy::default_trait_access)]
#![warn(clippy::doc_markdown)]
#![warn(clippy::explicit_iter_loop)]
#![warn(clippy::future_not_send)]
#![warn(clippy::implicit_clone)]
#![warn(clippy::literal_string_with_formatting_args)]
#![warn(clippy::match_same_arms)]
#![warn(clippy::min_ident_chars)]
#![warn(clippy::needless_raw_strings)]
#![warn(clippy::option_if_let_else)]
#![warn(clippy::redundant_clone)]
#![warn(clippy::ref_option)]
#![warn(clippy::redundant_closure)]
#![warn(clippy::uninlined_format_args)]
#![warn(clippy::unnecessary_wraps)]
#![warn(clippy::unused_async)]
pub mod attached_discussions;
pub mod auth;
pub mod body;
pub mod body_mutation;
pub mod body_rpc;
pub mod cache;
pub mod chat_stream;
pub mod chats;
pub mod client;
pub mod error;
pub mod files;
pub mod filters;
pub(crate) mod grpc_util;
mod http_client;
mod http_timeout;
pub mod keystore;
pub mod members;
pub mod objects;
pub mod paged;
pub mod process_watcher;
pub mod properties;
pub mod resolve;
pub mod search;
pub mod spaces;
pub mod tags;
pub mod templates;
pub mod types;
pub mod validation;
pub mod verify;
pub mod views;
pub mod test_util;
pub type Result<T, E = crate::error::AnytypeError> = std::result::Result<T, E>;
pub use anytype_rpc::deadline::{
ANYTYPE_GRPC_TIMEOUT_SECS, GrpcCallOptions, GrpcDeadlineError, GrpcEnclosingDeadline,
GrpcStreamDeadline, GrpcStreamError, GrpcTimeoutClass, GrpcTimeoutConfigError,
GrpcTimeoutOutcome, GrpcTimeoutPolicy, GrpcTimeoutSource, GrpcTransportProgress,
};
pub async fn scope_grpc_deadline<F, T>(deadline: tokio::time::Instant, operation: F) -> T
where
F: std::future::Future<Output = T>,
{
anytype_rpc::deadline::scope_grpc_enclosing_deadline(
GrpcEnclosingDeadline::from_instant(deadline),
operation,
)
.await
}
pub mod prelude {
pub use super::{
ANYTYPE_API_VERSION, ANYTYPE_DESKTOP_URL, ANYTYPE_GRPC_TIMEOUT_SECS, ANYTYPE_HEADLESS_URL,
GrpcCallOptions, GrpcDeadlineError, GrpcEnclosingDeadline, GrpcStreamDeadline,
GrpcStreamError, GrpcTimeoutClass, GrpcTimeoutConfigError, GrpcTimeoutOutcome,
GrpcTimeoutPolicy, GrpcTimeoutSource, GrpcTransportProgress, scope_grpc_deadline,
};
pub use crate::error::*;
pub use crate::{
attached_discussions::{
AttachedDiscussion, AttachedDiscussionErrorKind, AttachedDiscussionMetricsSnapshot,
AttachedDiscussionRequest, MAX_ATTACHED_DISCUSSION_OPERATION_TIMEOUT,
MAX_ATTACHED_DISCUSSION_RPC_TIMEOUT,
},
body::{
BlockContent, BlockId, BlockRef, BlockRestrictions, BlocksClient, BodyBlock,
BodyGraphErrorKind, BodyLimits, BodyRequest, BodySnapshot, BookmarkContent,
BookmarkState, CalloutIcon, ColorToken, DividerStyle, EmbedContent, EmbedProcessor,
FileBlockKind, FileBlockState, FileBlockStyle, FileView, HorizontalAlign, LayoutStyle,
LinkCard, LinkCardStyle, LinkDescriptionMode, LinkIconSize, MarkKind, OpaqueContent,
OpaqueSummary, RelationView, TextContent, TextMark, TextRange, TextStyle,
VerticalAlign,
},
body_mutation::{
BlockChange, BlockMutation, BodyBatchOutcome, BodyEditor, BodyOp, FailedBodyOp,
InsertPosition, NewBlock,
},
body_rpc::{
BodyRpcConfig, BodyRpcLifecycleErrorKind, BodyRpcMetrics, BodyRpcMetricsSnapshot,
DEFAULT_BODY_OPERATION_TIMEOUT, MAX_BODY_NON_SHOW_RESPONSE_BYTES, MAX_BODY_RPC_TIMEOUT,
MAX_BODY_SHOW_RESPONSE_BYTES,
},
cache::AnytypeCache,
client::{
AnytypeClient, ClientConfig, MAX_CHAT_SSE_EVENT_BYTES, MAX_DOCUMENT_RESPONSE_BYTES,
MAX_ERROR_RESPONSE_BYTES, MAX_FILE_RESPONSE_BYTES, MAX_JSON_RESPONSE_BYTES,
ResponseLimits,
},
filters::{Condition, Filter, FilterExpression, FilterOperator, Sort, SortDirection},
http_client::{HttpMetricsSnapshot, TimeoutMetricSnapshot},
http_timeout::{
ANYTYPE_HTTP_TIMEOUT_SECS, DEFAULT_LONG_HTTP_TIMEOUT, DEFAULT_SSE_ERROR_BODY_TIMEOUT,
DEFAULT_SSE_OPEN_TIMEOUT, DEFAULT_STANDARD_HTTP_TIMEOUT, HttpTimeoutClass,
HttpTimeoutPolicy, MAX_HTTP_TIMEOUT, TimeoutOutcome,
},
keystore::{HttpCredentials, KeyStore, KeyStoreType},
members::{Member, MemberRole, MemberStatus},
objects::{Color, DataModel, Icon, Object, ObjectLayout, object_link, object_link_shared},
paged::{PagedResult, PaginatedResponse, PaginationMeta},
properties::{Property, PropertyFormat, PropertyValue, PropertyWithValue, SetProperty},
resolve::{
ChatTarget, DEFAULT_CHAT_NAME, MAX_RESOLVE_CANDIDATE_NAME_CHARS,
MAX_RESOLVE_CANDIDATES, MAX_RESOLVE_SCAN_ITEMS, ResolveCandidate,
},
spaces::{Space, SpaceModel},
tags::{CreateTagRequest, Tag},
types::{
CreateTypeProperty, MAX_TYPE_PROPERTY_LINKS, MAX_TYPE_PROPERTY_RPC_TIMEOUT, Type,
TypeLayout, TypePropertyClassification, TypePropertyClassificationErrorKind,
TypePropertyClassificationMetricsSnapshot,
},
validation::ValidationLimits,
verify::{
MAX_VERIFY_ATTEMPTS, VerifyConfig, verify_semantic, verify_semantic_with_remaining,
},
views::{
CollectionMemberAddOutcome, CollectionMembershipContinuation,
CollectionMembershipEvidenceKind, CollectionMembershipMetricsSnapshot,
CollectionMembershipObservation, CollectionMembershipPage, CollectionMembershipState,
View, ViewLayout,
},
};
pub use crate::{
chat_stream::{
BackoffPolicy, ChatEvent, ChatEventStream, ChatStreamBuilder, ChatStreamControl,
ChatStreamHandle,
},
chats::{
ChatClient, ChatCreateRequest, ChatGetMessageRequest, ChatGetRequest,
ChatHistoryEvidenceKind, ChatHttpAddMessageRequest, ChatHttpEditMessageRequest,
ChatHttpEvent, ChatHttpEventStream, ChatHttpListMessagesRequest, ChatHttpListRequest,
ChatHttpMessageStreamRequest, ChatHttpReadMessagesRequest, ChatListRequest,
ChatListResult, ChatMessage, ChatMessageEditEvidence, ChatMessageHistoryPage,
ChatMessageHistoryRequest, ChatMessageSearchPage, ChatMessageSearchResult,
ChatMessagesPage, ChatReadAllRequest, ChatReadReactionsRequest, ChatReadType,
ChatResolveRequest, ChatSearchMessagesRequest, ChatSearchRequest, ChatSpaceRequest,
ChatState, ChatTimestampField, ChatToggleReactionRequest, MAX_CHAT_HISTORY_PAGE_SIZE,
MAX_MESSAGE_BEFORE_ANCHOR_BYTES, MessageAttachment, MessageAttachmentType,
MessageBeforeAnchor, MessageBlock, MessageBlockEditorQuote, MessageBlockEmbed,
MessageBlockLink, MessageBlockLinkType, MessageBlockMessageQuote,
MessageBlockProcessor, MessageBlockText, MessageContent, MessageReaction,
MessageTextMark, MessageTextMarkType, MessageTextRange, MessageTextStyle,
SpaceChatsClient, canonical_chat_timestamp,
},
client::find_grpc,
files::{
FileContentRequest, FileContentResponse, FileDeleteRequest, FileHttpMetadata,
FileHttpUploadRequest, FileObject, FileStyle, FileType, FileUploadResponse,
FilesClient, MAX_FILE_HEADER_EVIDENCE_BYTES, MAX_FILE_REQUEST_ATTEMPTS,
},
keystore::GrpcCredentials,
process_watcher::{
ProcessCompletionFallback, ProcessKind, ProcessWatchCancelToken, ProcessWatchProgress,
ProcessWatchRequest, ProcessWatcher, ProcessWatcherTimeouts,
},
spaces::{
BackupExportFormat, BackupSpaceRequest, DeleteAllArchivedResult, SpaceBackupResult,
SpaceInvite, SpaceInvitePermission, SpaceInviteType,
},
};
}
pub const ANYTYPE_API_VERSION: &str = "2025-11-08";
pub const ANYTYPE_DESKTOP_URL: &str = "http://127.0.0.1:31009";
pub const ANYTYPE_HEADLESS_URL: &str = "http://127.0.0.1:31012";
pub(crate) mod config {
pub const ANYTYPE_URL_ENV: &str = "ANYTYPE_URL";
pub const ANYTYPE_API_HEADER: &str = "Anytype-Version";
pub const DEFAULT_SERVICE_NAME: &str = "anytype_rust";
pub const RATE_LIMIT_WAIT_WARN_SECS: u64 = 5;
pub const RATE_LIMIT_WAIT_MAX_SECS: u64 = 30;
pub const RATE_LIMIT_MAX_RETRIES_ENV: &str = "ANYTYPE_RATE_LIMIT_MAX_RETRIES";
pub const RATE_LIMIT_MAX_RETRIES_DEFAULT: u32 = 5;
pub const MAX_PAGINATION_LIMIT: u32 = 1000;
pub const DEFAULT_PAGINATION_LIMIT: u32 = 100;
pub const MAX_RETRIES: u32 = 3;
pub const MAX_HTTP_REQUEST_ATTEMPTS: u32 = 6;
pub const VALIDATION_MARKDOWN_MAX_LEN: u64 = 10 * 1024 * 1024;
pub const VALIDATION_NAME_MAX_LEN: u32 = 4096;
pub const VALIDATION_TAG_MAX_COUNT: u32 = 4096;
pub const VALIDATION_TAG_MAX_LEN: u32 = 1024;
pub const VALIDATION_OID_MIN_LEN: u32 = 20;
pub const VALIDATION_OID_MAX_LEN: u32 = 200;
pub const VALIDATION_MAX_QUERY_LEN: u32 = 4000;
#[doc(hidden)]
pub const ANYTYPE_TEST_URL_ENV: &str = "ANYTYPE_TEST_URL";
#[doc(hidden)]
pub const ANYTYPE_TEST_URL: &str = super::ANYTYPE_HEADLESS_URL;
#[doc(hidden)]
#[allow(dead_code)]
pub const ANYTYPE_TEST_KEY_SERVICE: &str = "anytype_test";
}
#[doc(hidden)]
#[macro_export]
macro_rules! test_assert {
($cond:expr, $msg:expr) => {
if !$cond {
return Err($crate::test_util::TestError::Assertion {
message: $msg.to_string(),
});
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! test_assert_eq {
($left:expr, $right:expr, $msg:expr) => {
if $left != $right {
return Err($crate::test_util::TestError::Assertion {
message: format!("{}: expected {:?}, got {:?}", $msg, $right, $left),
});
}
};
}