Skip to main content

reifydb_export/render/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4pub mod ddl;
5pub mod dml;
6pub mod layout;
7pub mod typ;
8pub mod value;
9
10use crate::{
11	error::ExportError,
12	model::ExportModel,
13	options::ExportOptions,
14	render::{dml::render_inserts, layout::build_layout},
15};
16
17pub fn render_script(model: &ExportModel, options: &ExportOptions) -> Result<String, ExportError> {
18	let mut out = String::new();
19	out.push_str("# ReifyDB logical export\n\n");
20
21	if options.includes_schema() {
22		for namespace in &model.namespaces {
23			out.push_str(&ddl::render_namespace(namespace, options.if_not_exists));
24			out.push('\n');
25		}
26		if !model.namespaces.is_empty() {
27			out.push('\n');
28		}
29		for sumtype in &model.sumtypes {
30			out.push_str(&ddl::render_enum(sumtype, &model.resolver, options.if_not_exists)?);
31			out.push('\n');
32		}
33		for dictionary in &model.dictionaries {
34			out.push_str(&ddl::render_dictionary(dictionary, &model.resolver, options.if_not_exists)?);
35			out.push('\n');
36		}
37		for table in &model.tables {
38			out.push_str(&ddl::render_table(&table.table, &model.resolver, options.if_not_exists)?);
39			out.push('\n');
40		}
41		for queue in &model.queues {
42			out.push_str(&ddl::render_queue(&queue.queue, &model.resolver)?);
43			out.push('\n');
44		}
45
46		for ringbuffer in &model.ringbuffers {
47			out.push_str(&ddl::render_ringbuffer(&ringbuffer.ringbuffer, &model.resolver)?);
48			out.push('\n');
49		}
50		for series in &model.series {
51			out.push_str(&ddl::render_series(&series.series, &model.resolver)?);
52			out.push('\n');
53		}
54		out.push('\n');
55	}
56
57	if options.includes_data() {
58		for table in &model.tables {
59			if let Some(rows) = &table.rows {
60				let name = ddl::qualified_name(
61					&model.resolver,
62					table.table.namespace.0,
63					&table.table.name,
64					&table.table.name,
65				)?;
66				let layout = build_layout(&table.table.columns, &model.resolver);
67				out.push_str(&render_inserts(
68					&name,
69					rows,
70					options.insert_batch_size,
71					&layout,
72					&model.resolver,
73				)?);
74			}
75		}
76		for ringbuffer in &model.ringbuffers {
77			if let Some(rows) = &ringbuffer.rows {
78				let name = ddl::qualified_name(
79					&model.resolver,
80					ringbuffer.ringbuffer.namespace.0,
81					&ringbuffer.ringbuffer.name,
82					&ringbuffer.ringbuffer.name,
83				)?;
84				let layout = build_layout(&ringbuffer.ringbuffer.columns, &model.resolver);
85				out.push_str(&render_inserts(
86					&name,
87					rows,
88					options.insert_batch_size,
89					&layout,
90					&model.resolver,
91				)?);
92			}
93		}
94		for series in &model.series {
95			if let Some(rows) = &series.rows {
96				let name = ddl::qualified_name(
97					&model.resolver,
98					series.series.namespace.0,
99					&series.series.name,
100					&series.series.name,
101				)?;
102				let layout = build_layout(&series.series.columns, &model.resolver);
103				out.push_str(&render_inserts(
104					&name,
105					rows,
106					options.insert_batch_size,
107					&layout,
108					&model.resolver,
109				)?);
110			}
111		}
112	}
113
114	Ok(out)
115}