1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2018, the Perspective Authors.
//
// This file is part of the Perspective library, distributed under the terms
// of the Apache License 2.0. The full license can be found in the LICENSE
// file.
//! Here lies Perspective's attempt to avoid a monolithic Application State
//! object. The major components which hold `PerspectiveViewer`-scoped state
//! are broken up roughly by some single resource responsibility -
//!
//! - `Session` manages the `@finos/perspective` engine `Table` and `View`
//! objects, plus caches some related metadata `Schema`.
//! - `Renderer` manages the JavaScript Custom Element plugin.
//! - .. etc.
//!
//! For complex tasks which involve overlapping state/coordination between >1 of
//! these Application State objects, Perspective uses a set of respective `Has*`
//! traits, (e.g. `HasSession`), to provide extra functions for object which
//! implement more than one such trait. These can be conveniently derived by
//! consistently naming the application state object clones when used as struct
//! fields, then applying the `derive_model!()` macro for the state object you
//! wish to expose.
//!
//! # Examples
//!
//! ```rust
//! struct A {
//! session: Session,
//! }
//!
//! struct B {
//! renderer: Renderer,
//! }
//!
//! struct C {
//! session: Session,
//! renderer: Renderer,
//! }
//!
//! derive_model!(Session for A);
//! derive_model!(Renderer for B);
//! derive_model!(Session, Renderer for C);
//!
//! trait SessionRenderModel: HasSession + HasRenderer {
//! fn render_session_now(&self) {
//! // Do some thing that requires `.session()` and `.renderer()`
//! }
//! }
//!
//! impl<T: HasSession + HasRenderer> SessionRenderModel for T {}
//!
//! fn test(session: Session, renderer: Renderer) {
//! // Type errors
//! (A { session }).render_session_now();
//! (B { renderer }).render_session_now();
//!
//! // The method exists only when both state object clones exist
//! (C { session, renderer }).render_session_now();
//! }
//! ```
pub use *;
pub use *;
pub use *;
pub use *;
pub use *;
pub use *;