Files
tools/publish/src/main.rs
T

133 lines
4.7 KiB
Rust
Raw Normal View History

2026-06-08 19:33:49 -04:00
mod app;
2026-08-05 11:21:25 -04:00
mod args;
2026-08-08 23:50:04 -04:00
mod error;
mod navigator;
mod rdf;
mod theme;
mod widget;
mod windows;
2026-06-08 19:33:49 -04:00
2026-08-08 23:50:04 -04:00
use crate::app::Publisher;
use crate::args::{AppArgs, Command};
2026-08-05 11:21:25 -04:00
use clap::Parser;
2026-08-12 14:11:47 -04:00
use gl_search::{Schema, SearchIndex};
2026-08-05 11:21:25 -04:00
use iced::futures::StreamExt;
use ldp::middleware::BasicAuthMiddleware;
use ldp::reqwest::{Client, Url};
use ldp::reqwest_middleware::ClientBuilder;
use ldp::traverse::Traverse;
2026-08-12 14:11:47 -04:00
use oxigraph::model::Dataset;
2026-08-07 19:28:08 -04:00
use tracing::{debug_span, error, field};
2026-08-08 23:50:04 -04:00
use tracing_subscriber::fmt::format::FmtSpan;
2026-06-08 19:33:49 -04:00
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
use tracing_subscriber::{EnvFilter, fmt};
2026-08-12 14:11:47 -04:00
use gl_graph::index::index_ontology;
use gl_graph::language;
use gl_inference::proto::ontology_client::OntologyClient;
use gl_inference::proto::OntologyQueryRequest;
2026-06-08 19:33:49 -04:00
fn main() -> color_eyre::Result<()> {
let appender = tracing_appender::rolling::never("/tmp", "publisher-log");
tracing_subscriber::registry()
2026-08-08 23:50:04 -04:00
.with(
fmt::layer()
.with_span_events(FmtSpan::CLOSE)
.with_writer(appender),
)
2026-06-08 19:33:49 -04:00
.with(EnvFilter::from_default_env())
.init();
color_eyre::install()?;
2026-08-05 11:21:25 -04:00
let mut index = SearchIndex::builder()
.with_path("/home/alex/.local/share/org.graphofliberty.desktop/index")
.build()
.expect("Failed to build search index");
let args = AppArgs::parse();
match args.command {
2026-08-07 18:16:03 -04:00
Some(Command::Query(args)) => {
let raw_query = String::from_utf8(std::fs::read(&args.query_path)?)?;
2026-08-12 14:11:47 -04:00
let graph = if let Some(dataset_path) = &args.dataset_path {
Some(String::from_utf8(std::fs::read(dataset_path)?)?)
} else { None };
let runtime = tokio::runtime::Builder::new_multi_thread()
.enable_all()
.name("inference-client")
.build()?;
runtime.block_on(async {
let mut client = OntologyClient::connect("http://[::1]:3000").await.unwrap();
let mut request = OntologyQueryRequest::default();
request.sparql_query = raw_query;
request.turtle = graph;
let response = client.query(request).await.unwrap();
println!("{}", response.get_ref().results);
});
2026-08-05 11:21:25 -04:00
}
2026-08-07 18:16:03 -04:00
Some(Command::Search(args)) => {
2026-08-12 14:11:47 -04:00
for document in index.query(args.discriminant, &args.query, Schema::all_fields(), 500000)? {
println!("{}", gl_search::to_json(document));
}
2026-08-07 18:16:03 -04:00
}
2026-08-05 11:21:25 -04:00
Some(Command::Reindex) => {
2026-08-05 18:33:30 -04:00
let mut writer = index.writer()?;
2026-08-05 11:21:25 -04:00
debug_span!("Clear Index").in_scope(|| {
writer.delete_all_documents()?;
writer.commit()
})?;
let runtime = tokio::runtime::Builder::new_multi_thread()
.enable_all()
2026-08-12 14:11:47 -04:00
.name("reindex")
2026-08-05 11:21:25 -04:00
.build()?;
2026-08-12 14:11:47 -04:00
runtime.block_on(async {
let mut client = OntologyClient::connect("http://[::1]:3000").await.unwrap();
let documents = index_ontology(&mut client, &language::ENGLISH_OR_UNTAGGED).await.unwrap();
debug_span!("Index Ontology", documents = field::Empty).in_scope(|| {
for document in documents {
writer.add_document(document).unwrap();
}
});
});
let mut writer = runtime.block_on(async move {
2026-08-05 11:21:25 -04:00
let http_client = ClientBuilder::new(Client::new())
.with(BasicAuthMiddleware::new(
"fedoraAdmin".to_string(),
Some("fedoraAdmin".to_string()),
))
.build();
2026-08-12 14:11:47 -04:00
let starting_url = Url::parse("http://fedora.quill.lan/rest/").unwrap();
2026-08-07 18:16:03 -04:00
let mut dataset = Dataset::new();
2026-08-05 11:21:25 -04:00
let mut traversal = Traverse::new(http_client, starting_url, None);
while let Some(result) = traversal.next().await {
match result {
2026-08-07 18:16:03 -04:00
Ok(rdf_source) => dataset.extend(rdf_source.dataset()),
2026-08-05 11:21:25 -04:00
Err(err) => error!(?err),
}
}
2026-08-07 18:16:03 -04:00
2026-08-12 14:11:47 -04:00
let span = debug_span!("Index Repository", rdf_sources = field::Empty, documents = field::Empty).entered();
2026-08-05 18:33:30 -04:00
Ok::<_, gl_search::SearchError>(writer)
2026-08-12 14:11:47 -04:00
})?;
2026-08-05 11:21:25 -04:00
2026-08-08 23:50:04 -04:00
debug_span!("Commit").in_scope(|| writer.commit())?;
2026-08-05 11:21:25 -04:00
}
None => {
iced::daemon(Publisher::new, Publisher::update, Publisher::view)
.title(Publisher::title)
.subscription(Publisher::subscription)
.run()?;
}
}
2026-06-08 19:33:49 -04:00
Ok(())
}