Skip to main content

saola_psl/
lib.rs

1#![doc = include_str!("../README.md")]
2#![deny(rust_2018_idioms, unsafe_code, missing_docs)]
3
4pub use psl_core::builtin_connectors;
5use psl_core::parser_database::{ExtensionTypes, Files, NoExtensionTypes};
6pub use psl_core::{
7    ALL_PREVIEW_FEATURES,
8    Configuration,
9    ConnectorRegistry,
10    Datasource,
11    DatasourceConnectorData,
12    DatasourceUrls,
13    FeatureMapWithProvider,
14    Generator,
15    GeneratorConfigValue,
16    PreviewFeature,
17    PreviewFeatures,
18    StringFromEnvVar,
19    ValidatedSchema,
20    builtin_connectors::{can_have_capability, can_support_relation_load_strategy, has_capability},
21    datamodel_connector,
22    diagnostics::{self, Diagnostics},
23    generators,
24    is_reserved_type_name,
25    mcf::config_to_mcf_json_value as get_config,
26    mcf::{generators_to_json, render_sources_to_json}, // for tests
27    parser_database::{self, SourceFile},
28    reachable_only_with_capability,
29    reformat,
30    reformat_multiple,
31    reformat_validated_schema_into_single,
32    schema_ast,
33    set_config_dir,
34};
35
36/// The implementation of the CLI getConfig() utility and its JSON format.
37pub mod get_config {
38    pub use psl_core::mcf::{config_to_mcf_json_value as get_config, *};
39}
40
41/// Parses and validate a schema, but skip analyzing everything except datasource and generator
42/// blocks.
43pub fn parse_configuration(schema: &str) -> Result<Configuration, Diagnostics> {
44    psl_core::parse_configuration(schema, builtin_connectors::BUILTIN_CONNECTORS)
45}
46
47/// Parses and validates Prisma schemas, but skip analyzing everything except datasource and generator
48/// blocks.
49pub fn parse_configuration_multi_file(
50    files: &[(String, SourceFile)],
51) -> Result<(Files, Configuration), (Files, Diagnostics)> {
52    psl_core::parse_configuration_multi_file(files, builtin_connectors::BUILTIN_CONNECTORS)
53}
54
55/// Parses and validates Prisma schemas, but skip analyzing everything except datasource and generator
56/// blocks. It never fails, but when the returned `Diagnostics` contains errors, it implies that the
57/// `Configuration` content is partial.
58/// Consumers may then decide  whether to convert `Diagnostics` into an error.
59pub fn error_tolerant_parse_configuration(files: &[(String, SourceFile)]) -> (Files, Configuration, Diagnostics) {
60    psl_core::error_tolerant_parse_configuration(files, builtin_connectors::BUILTIN_CONNECTORS)
61}
62
63/// Parse and analyze a Prisma schema.
64pub fn parse_schema(
65    file: impl Into<SourceFile>,
66    extension_types: &dyn ExtensionTypes,
67) -> Result<ValidatedSchema, String> {
68    let mut schema = validate(file.into(), extension_types);
69    schema
70        .diagnostics
71        .to_result()
72        .map_err(|err| err.to_pretty_string("schema.prisma", schema.db.source_assert_single()))?;
73    Ok(schema)
74}
75
76/// Parse and analyze a Prisma schema.
77/// This variant does not support extensions.
78pub fn parse_schema_without_extensions(file: impl Into<SourceFile>) -> Result<ValidatedSchema, String> {
79    parse_schema(file, &NoExtensionTypes)
80}
81
82/// Parse and analyze a Prisma schema.
83pub fn parse_schema_multi(
84    files: &[(String, SourceFile)],
85    extension_types: &dyn ExtensionTypes,
86) -> Result<ValidatedSchema, String> {
87    let mut schema = validate_multi_file(files, extension_types);
88
89    schema
90        .diagnostics
91        .to_result()
92        .map_err(|err| schema.db.render_diagnostics(&err))?;
93
94    Ok(schema)
95}
96
97/// Parse and analyze a Prisma schema.
98/// This variant does not support extensions.
99pub fn parse_schema_multi_without_extensions(files: &[(String, SourceFile)]) -> Result<ValidatedSchema, String> {
100    parse_schema_multi(files, &NoExtensionTypes)
101}
102
103/// The most general API for dealing with Prisma schemas. It accumulates what analysis and
104/// validation information it can, and returns it along with any error and warning diagnostics.
105pub fn validate(file: SourceFile, extension_types: &dyn ExtensionTypes) -> ValidatedSchema {
106    psl_core::validate(file, builtin_connectors::BUILTIN_CONNECTORS, extension_types)
107}
108
109/// The most general API for dealing with Prisma schemas. It accumulates what analysis and
110/// validation information it can, and returns it along with any error and warning diagnostics.
111/// This variant does not support extensions.
112pub fn validate_without_extensions(file: SourceFile) -> ValidatedSchema {
113    validate(file, &NoExtensionTypes)
114}
115
116/// Parse a Prisma schema, but skip validations.
117pub fn parse_without_validation(
118    file: SourceFile,
119    connector_registry: ConnectorRegistry<'_>,
120    extension_types: &dyn ExtensionTypes,
121) -> ValidatedSchema {
122    psl_core::parse_without_validation(file, connector_registry, extension_types)
123}
124
125/// The most general API for dealing with Prisma schemas. It accumulates what analysis and
126/// validation information it can, and returns it along with any error and warning diagnostics.
127pub fn validate_multi_file(files: &[(String, SourceFile)], extension_types: &dyn ExtensionTypes) -> ValidatedSchema {
128    psl_core::validate_multi_file(files, builtin_connectors::BUILTIN_CONNECTORS, extension_types)
129}
130
131/// The most general API for dealing with Prisma schemas. It accumulates what analysis and
132/// validation information it can, and returns it along with any error and warning diagnostics.
133/// This variant does not support extensions.
134pub fn validate_multi_file_without_extensions(files: &[(String, SourceFile)]) -> ValidatedSchema {
135    validate_multi_file(files, &NoExtensionTypes)
136}