1use crate::Resolver;
8use crate::Promise;
9use crate::Blueprint;
10use crate::Builder;
11use crate::CanRef;
12use crate::CanStrong;
13use crate::CanSized;
14use crate::Can;
15use crate::Never;
16
17use std::fmt;
18use std::fmt::Debug;
19use std::marker::PhantomData;
20
21
22
23#[derive(Debug, Clone)]
50pub struct RedeemingBuilder<AP, ArtBin> {
51 inner: AP,
52 default_value: Option<ArtBin>,
53}
54
55impl<AP, ArtBin> RedeemingBuilder<AP, ArtBin> {
56
57 pub fn new<ArtCan, BCan, B: ?Sized, T>(
62 inner: AP,
63 default_value: Option<ArtBin>
64 ) -> Self
65 where
66 B: Builder<ArtCan, BCan, Artifact=T>,
67 BCan: Can<AP::Builder>,
68 AP: Promise<Builder = B, BCan = BCan>,
69 T: Debug + 'static,
70 ArtCan: Clone + CanSized<T,Bin=ArtBin>,
71 ArtBin: Clone + Debug + 'static,
72 BCan: Clone + CanStrong,
73 BCan: CanSized<Self>,
74 {
75
76 RedeemingBuilder {
77 inner,
78 default_value,
79 }
80 }
81}
82
83impl<ArtCan, AP, B: ?Sized, BCan, ArtBin, T> Builder<ArtCan, BCan> for RedeemingBuilder<AP, ArtBin>
84 where
85 B: Builder<ArtCan, BCan, Artifact=T>,
86 BCan: Can<B>,
87 AP: Promise<Builder = B, BCan = BCan>,
88 T: Debug + 'static,
89 ArtCan: Clone + CanSized<T,Bin=ArtBin>,
90 ArtBin: Clone + Debug + 'static,
91 BCan: Clone + CanStrong,
92 {
93
94 type Artifact = T;
95 type DynState = Option<ArtCan::Bin>;
96 type Err = Never;
97
98 fn build(&self, resolver: &mut Resolver<ArtCan, BCan, Self::DynState>)
99 -> Result<ArtCan::Bin, Never> {
100
101 let value = resolver.resolve(&self.inner);
102
103 if let Ok(v) = value {
104 *resolver.my_state() = Some(v.clone());
105
106 Ok(v)
108
109 } else {
110 Ok(resolver.my_state().clone().unwrap())
114 }
115 }
116
117 fn init_dyn_state(&self) -> Self::DynState {
118 self.default_value.clone()
119 }
120}
121
122
123
124
125pub struct FunctionalBuilder<ArtCan, BCan, F, T, S = ()> {
213 inner: F,
214 initial_state: S,
215 _art_can: PhantomData<ArtCan>,
216 _b_can: PhantomData<BCan>,
217 _t: PhantomData<T>,
218}
219
220impl<ArtCan, BCan, F, T, S> Debug for FunctionalBuilder<ArtCan, BCan, F, T, S> {
221 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
222 write!(fmt, "FunctionalBuilder{{...}}")
223 }
224}
225
226impl<ArtCan, BCan, F, E, T> FunctionalBuilder<ArtCan, BCan, F, T, ()>
227 where
228 F: (for<'r> Fn( &'r mut () ) -> Result<ArtCan::Bin,E>) + 'static,
229 E: Debug + 'static,
230 T: Debug + 'static,
231 BCan: CanStrong,
232 ArtCan: Can<T>,
233 ArtCan: Debug + 'static {
234
235 pub fn new(f: F) -> Self {
238 FunctionalBuilder::with_state( (), f )
239 }
240}
241
242impl<ArtCan, BCan, F, E, T, S> FunctionalBuilder<ArtCan, BCan, F, T, S>
243 where
244 F: (for<'r> Fn(&'r mut S) -> Result<ArtCan::Bin,E>) + 'static,
245 E: Debug + 'static,
246 T: Debug + 'static,
247 S: Clone + Debug + 'static,
248 BCan: CanStrong,
249 ArtCan: Can<T>,
250 ArtCan: Debug + 'static {
251
252 pub fn with_state(initial_state: S, f: F) -> Self {
255 FunctionalBuilder {
256 inner: f,
257 initial_state,
258 _art_can: PhantomData,
259 _b_can: PhantomData,
260 _t: PhantomData,
261 }
262 }
263}
264
265impl<ArtCan, BCan, F, E, T, S> Builder<ArtCan, BCan> for FunctionalBuilder<ArtCan, BCan, F, T, S>
284 where
285 F: (for<'r> Fn( &'r mut S ) -> Result<ArtCan::Bin,E>) + 'static,
286 E: Debug + 'static,
287 T: Debug + 'static,
288 S: Clone + Debug + 'static,
289 BCan: CanStrong,
290 ArtCan: Can<T>,
291 ArtCan: Debug + 'static {
292
293 type Artifact = T;
294 type DynState = S;
295 type Err = E;
296
297 fn build(&self, resolver: &mut Resolver<ArtCan, BCan, Self::DynState>)
298 -> Result<ArtCan::Bin, Self::Err> {
299
300 let f = &self.inner;
301 let state = resolver.my_state();
302
303 f(state)
304
305 }
306 fn init_dyn_state(&self) -> Self::DynState {
307 self.initial_state.clone()
308 }
309}
310
311
312
313
314pub struct ConstBuilder<ArtCan, BCan, ArtBin, T> {
342 inner: ArtBin,
343 _art_can: PhantomData<ArtCan>,
344 _b_can: PhantomData<BCan>,
345 _t: PhantomData<T>,
346}
347
348impl<ArtCan, BCan, ArtBin: Debug, T> Debug for ConstBuilder<ArtCan, BCan, ArtBin, T> {
349 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
350 write!(fmt, "FunctionalBuilder{{inner: {:?}}}", self.inner)
351 }
352}
353
354impl<ArtCan, BCan, ArtBin, T> ConstBuilder<ArtCan, BCan, ArtBin, T>
355 where
356 BCan: CanStrong,
357 ArtCan: Can<T,Bin=ArtBin>,
358 ArtCan: 'static,
359 ArtBin: Clone + Debug + 'static, {
360
361 pub fn new(artifact_bin: ArtBin) -> Self {
364
365 ConstBuilder {
366 inner: artifact_bin,
367 _art_can: PhantomData,
368 _b_can: PhantomData,
369 _t: PhantomData,
370 }
371 }
372}
373
374impl<ArtCan, BCan, ArtBin, T> From<T> for Blueprint<ConstBuilder<ArtCan, BCan, ArtBin, T>, BCan>
375 where
376 T: Clone + Debug + 'static,
377 BCan: CanStrong,
378 BCan: CanSized<ConstBuilder<ArtCan, BCan, ArtBin, T>>,
379 ArtCan: CanSized<T,Bin=ArtBin>,
380 ArtCan: 'static,
381 ArtBin: Clone + Debug + 'static, {
382
383 fn from(t: T) -> Self {
384 Blueprint::new(
385 ConstBuilder::new(ArtCan::into_bin(t))
386 )
387 }
388}
389
390impl<ArtCan, BCan, ArtBin, T> Builder<ArtCan, BCan> for ConstBuilder<ArtCan, BCan, ArtBin, T>
391 where
392 T: Debug + 'static,
393 BCan: CanStrong,
394 ArtCan: Can<T,Bin=ArtBin>,
395 ArtCan: 'static,
396 ArtBin: Clone + Debug + 'static, {
397
398 type Artifact = T;
399 type DynState = ();
400 type Err = Never;
401
402 fn build(&self, _resolver: &mut Resolver<ArtCan, BCan>)
403 -> Result<ArtBin, Never> {
404
405 Ok(self.inner.clone())
406 }
407 fn init_dyn_state(&self) -> Self::DynState {
408 }
410}
411
412
413
414
415pub struct ConfigurableBuilder<ArtCan, BCan, T> {
445 initial: T,
446 _art_can: PhantomData<ArtCan>,
447 _b_can: PhantomData<BCan>,
448}
449
450impl<ArtCan, BCan, T: Debug> Debug for ConfigurableBuilder<ArtCan, BCan, T> {
451 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
452 write!(fmt, "FunctionalBuilder{{initial: {:?}}}", self.initial)
453 }
454}
455
456impl<ArtCan, BCan, T> ConfigurableBuilder<ArtCan, BCan, T>
457 where
458 T: Clone + Debug + 'static,
459 BCan: CanStrong,
460 ArtCan: Debug + 'static {
461
462 pub fn new(artifact: T) -> Self {
465 ConfigurableBuilder {
466 initial: artifact,
467 _art_can: PhantomData,
468 _b_can: PhantomData,
469 }
470 }
471}
472
473impl<ArtCan, BCan, T> From<T> for Blueprint<ConfigurableBuilder<ArtCan, BCan, T>, BCan>
474 where
475 T: Clone + Debug + 'static,
476 BCan: CanStrong,
477 BCan: CanSized<ConfigurableBuilder<ArtCan, BCan, T>>,
478 ArtCan: Debug + 'static {
479
480 fn from(t: T) -> Self {
481 Blueprint::new(
482 ConfigurableBuilder::new(t)
483 )
484 }
485}
486
487impl<ArtCan, BCan, T> Builder<ArtCan, BCan> for ConfigurableBuilder<ArtCan, BCan, T>
488 where
489 T: Clone + Debug + 'static,
490 BCan: CanStrong,
491 ArtCan: CanSized<T>,
492 ArtCan: Debug + 'static {
493
494 type Artifact = T;
495 type DynState = T;
496 type Err = Never;
497
498 fn build(&self, resolver: &mut Resolver<ArtCan, BCan, T>)
499 -> Result<ArtCan::Bin, Never> {
500
501 Ok(ArtCan::into_bin(resolver.my_state().clone()))
502 }
503 fn init_dyn_state(&self) -> Self::DynState {
504 self.initial.clone()
505 }
506}
507
508
509
510
511#[derive(Debug, Clone)]
526pub struct ClonedBuilder<AP> {
527 inner: AP,
528}
529
530impl<AP> ClonedBuilder<AP> {
531
532 pub fn new<ArtCan, BCan, B: ?Sized>(
535 inner: AP,
536 ) -> Self
537 where
538 B: Builder<ArtCan, BCan>,
539 B::Artifact: Clone,
540 BCan: Can<AP::Builder>,
541 AP: Promise<Builder = B, BCan = BCan>,
542 ArtCan: CanRef<B::Artifact>,
543 BCan: Clone + CanStrong,
544 BCan: CanSized<Self>,
545 {
546
547 ClonedBuilder {
548 inner,
549 }
550 }
551}
552
553impl<ArtCan, AP, B: ?Sized, BCan> Builder<ArtCan, BCan> for ClonedBuilder<AP>
554 where
555 B: Builder<ArtCan, BCan>,
556 B::Artifact: Clone,
557 BCan: Can<B>,
558 AP: Promise<Builder = B, BCan = BCan>,
559 ArtCan: CanRef<B::Artifact>,
560 BCan: CanStrong,
561 {
562
563 type Artifact = B::Artifact;
564 type DynState = ();
565 type Err = B::Err;
566
567 fn build(&self, resolver: &mut Resolver<ArtCan, BCan, Self::DynState>)
568 -> Result<ArtCan::Bin, Self::Err> {
569
570 resolver.resolve_cloned(&self.inner)
571 .map(ArtCan::into_bin)
572 }
573
574 fn init_dyn_state(&self) -> Self::DynState {
575 }
577}
578
579
580
581#[derive(Debug, Clone)]
595pub struct ForwardingBuilder<AP> {
596 inner: AP,
597}
598
599impl<AP> ForwardingBuilder<AP> {
600
601 pub fn new<ArtCan, BCan, B: ?Sized>(
604 inner: AP,
605 ) -> Self
606 where
607 B: Builder<ArtCan, BCan>,
608 BCan: Can<AP::Builder>,
609 AP: Promise<Builder = B, BCan = BCan>,
610 ArtCan: CanSized<B::Artifact>,
611 ArtCan: Clone,
612 BCan: CanStrong,
613 BCan: CanSized<Self>,
614 {
615
616 ForwardingBuilder {
617 inner,
618 }
619 }
620}
621
622impl<ArtCan, AP, B: ?Sized, BCan> Builder<ArtCan, BCan> for ForwardingBuilder<AP>
623 where
624 B: Builder<ArtCan, BCan>,
625 BCan: Can<B>,
626 AP: Promise<Builder = B, BCan = BCan>,
627 ArtCan: CanSized<B::Artifact>,
628 ArtCan: Clone,
629 BCan: CanStrong,
630 {
631
632 type Artifact = B::Artifact;
633 type DynState = ();
634 type Err = B::Err;
635
636 fn build(&self, resolver: &mut Resolver<ArtCan, BCan, Self::DynState>)
637 -> Result<ArtCan::Bin, Self::Err> {
638
639 resolver.resolve(&self.inner)
640 }
641
642 fn init_dyn_state(&self) -> Self::DynState {
643 }
645}
646
647
648
649#[derive(Debug, Clone)]
652pub struct FeigningBuilder<AP, Err> {
653 inner: AP,
654 _err: PhantomData<Err>,
655}
656
657impl<AP, Err> FeigningBuilder<AP, Err> {
658
659 pub fn new<ArtCan, BCan, B>(
662 inner: AP,
663 ) -> Self
664 where
665 B: Builder<ArtCan, BCan, Err=Never>,
666 BCan: Can<AP::Builder>,
667 AP: Promise<Builder = B, BCan = BCan>,
668 Err: Debug + 'static,
669 ArtCan: CanSized<B::Artifact>,
670 ArtCan: Clone,
671 BCan: CanStrong,
672 BCan: CanSized<Self>,
673 {
674
675 FeigningBuilder {
676 inner,
677 _err: PhantomData,
678 }
679 }
680}
681
682impl<ArtCan, AP, B: ?Sized, BCan, Err> Builder<ArtCan, BCan> for FeigningBuilder<AP, Err>
683 where
684 B: Builder<ArtCan, BCan, Err=Never>,
685 BCan: Can<B>,
686 AP: Promise<Builder = B, BCan = BCan>,
687 Err: Debug + 'static,
688 ArtCan: CanSized<B::Artifact>,
689 ArtCan: Clone,
690 BCan: CanStrong,
691 {
692
693 type Artifact = B::Artifact;
694 type DynState = ();
695 type Err = Err;
696
697 fn build(&self, resolver: &mut Resolver<ArtCan, BCan, Self::DynState>)
698 -> Result<ArtCan::Bin, Self::Err> {
699
700 resolver.resolve(&self.inner).map_err(|n| n.into_any())
701 }
702
703 fn init_dyn_state(&self) -> Self::DynState {
704 }
706}
707
708
709
710
711