risingwave_frontend/catalog/system_catalog/rw_catalog/
rw_features.rs

1// Copyright 2025 RisingWave Labs
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use std::collections::HashSet;
16
17use risingwave_common::license::{Feature, LicenseManager};
18use risingwave_common::types::Fields;
19use risingwave_frontend_macro::system_catalog;
20
21use crate::catalog::system_catalog::SysCatalogReaderImpl;
22use crate::error::Result;
23
24/// Check all defined premium features and their availability.
25#[derive(Fields)]
26struct RwFeature {
27    #[primary_key]
28    name: &'static str,
29    description: &'static str,
30    available: bool,
31}
32
33#[system_catalog(table, "rw_catalog.rw_features")]
34fn read_rw_features(_reader: &SysCatalogReaderImpl) -> Result<Vec<RwFeature>> {
35    let available_features: HashSet<_> = (LicenseManager::get().license())
36        .map(|l| l.tier.available_features().collect())
37        .unwrap_or_default();
38
39    Ok(Feature::all()
40        .iter()
41        .filter(|f| **f != Feature::TestDummy) // hide test feature
42        .map(|f| RwFeature {
43            name: f.name(),
44            description: f.description(),
45            available: available_features.contains(f),
46        })
47        .collect())
48}