brk_bindgen/generators/python/
mod.rs1pub mod api;
6pub mod client;
7pub mod tree;
8pub mod types;
9
10use std::{fmt::Write, io, path::Path};
11
12use super::write_if_changed;
13use crate::{ClientMetadata, Endpoint, TypeSchemas};
14
15pub fn generate_python_client(
19 metadata: &ClientMetadata,
20 endpoints: &[Endpoint],
21 schemas: &TypeSchemas,
22 output_path: &Path,
23) -> io::Result<()> {
24 let mut output = String::new();
25
26 writeln!(output, "# Auto-generated BRK Python client").unwrap();
27 writeln!(output, "# Do not edit manually\n").unwrap();
28 writeln!(output, "from __future__ import annotations").unwrap();
29 writeln!(output, "from dataclasses import dataclass").unwrap();
30 writeln!(
31 output,
32 "from typing import TypeVar, Generic, Any, Optional, List, Literal, TypedDict, Union, Protocol, overload, Iterator, Tuple, TYPE_CHECKING"
33 )
34 .unwrap();
35 writeln!(
36 output,
37 "from http.client import HTTPSConnection, HTTPConnection"
38 )
39 .unwrap();
40 writeln!(output, "from urllib.parse import urlparse").unwrap();
41 writeln!(output, "from datetime import date, timedelta").unwrap();
42 writeln!(output, "import json\n").unwrap();
43 writeln!(output, "if TYPE_CHECKING:").unwrap();
44 writeln!(output, " import pandas as pd # type: ignore[import-not-found]").unwrap();
45 writeln!(output, " import polars as pl # type: ignore[import-not-found]\n").unwrap();
46 writeln!(output, "T = TypeVar('T')\n").unwrap();
47
48 types::generate_type_definitions(&mut output, schemas);
49 client::generate_base_client(&mut output);
50 client::generate_endpoint_class(&mut output);
51 client::generate_index_accessors(&mut output, &metadata.index_set_patterns);
52 client::generate_structural_patterns(&mut output, &metadata.structural_patterns, metadata);
53 tree::generate_tree_classes(&mut output, &metadata.catalog, metadata);
54 api::generate_main_client(&mut output, endpoints);
55
56 write_if_changed(output_path, &output)?;
57
58 Ok(())
59}