component-shape-gpui 0.3.2

GPUI component shape runtime contracts and macros.
Documentation
use component_shape_gpui::{
    DefaultGpuiComponentShapeBuilder, GpuiComponentShape, GpuiComponentShapeBuilder,
    build_component_shape, component_shape,
};

pub struct SelectState {
    searchable: bool,
}

impl SelectState {
    fn new(_window: &mut gpui_kit::Window, _cx: &mut gpui_kit::Context<'_, Self>) -> Self {
        Self { searchable: false }
    }
}

component_shape! {
    pub struct SelectShape {
        type State = SelectState;
        value = String;
    }
}

pub struct SelectArgs {
    searchable: bool,
}

impl SelectShape {
    pub fn searchable(searchable: bool) -> SelectArgs {
        SelectArgs { searchable }
    }

    pub fn from(args: SelectArgs) -> SelectArgs {
        args
    }
}

impl GpuiComponentShapeBuilder<SelectShape> for SelectArgs {
    fn build(
        self,
        _window: &mut gpui_kit::Window,
        _cx: &mut gpui_kit::Context<'_, SelectState>,
    ) -> SelectState {
        SelectState {
            searchable: self.searchable,
        }
    }
}

fn default_select(
    window: &mut gpui_kit::Window,
    cx: &mut gpui_kit::Context<'_, <SelectShape as GpuiComponentShape>::State>,
) -> SelectState {
    build_component_shape::<SelectShape, _>(
        DefaultGpuiComponentShapeBuilder::<SelectShape>::new(),
        window,
        cx,
    )
}

fn searchable_select(
    window: &mut gpui_kit::Window,
    cx: &mut gpui_kit::Context<'_, <SelectShape as GpuiComponentShape>::State>,
) -> SelectState {
    build_component_shape::<SelectShape, _>(SelectShape::searchable(true), window, cx)
}

fn configured_select(
    window: &mut gpui_kit::Window,
    cx: &mut gpui_kit::Context<'_, <SelectShape as GpuiComponentShape>::State>,
) -> SelectState {
    build_component_shape::<SelectShape, _>(
        SelectShape::from(SelectArgs { searchable: true }),
        window,
        cx,
    )
}

fn main() {
    let _ = SelectState { searchable: false }.searchable;
    let _ = default_select;
    let _ = searchable_select;
    let _ = configured_select;
}