| 661 | let preview_failed = self |
| 662 | .stage_cache |
| 663 | .as_ref() |
| 664 | .is_some_and(|cache| cache.result.has_errors() || cache.result.has_assembler_error()); |
| 665 | |
| 666 | let mut failed = preview_failed; |
| 667 | if let Some(config) = config { |
| 668 | let out_dir = self.workspace.fs().host_out_dir(); |
| 669 | match SessionEngine::new(self.workspace.fs()) |
| 670 | .with_artifact_root(out_dir) |
| 671 | .build_config(&config) |
| 672 | { |
| 673 | Ok(outcome) => { |
| 674 | failed = false; |
| 675 | self.status_message = Some("built".to_owned()); |
| 676 | self.report_linked_build(&outcome); |
| 677 | } |
| 678 | Err(err) => { |
| 679 | failed = true; |
| 680 | self.status_message = Some("build failed".to_owned()); |
| 681 | // Compile failures the preview already diagnosed render as |
| 682 | // caret blocks below; the stringified error would repeat them. |
| 683 | if !(matches!(err, SessionEngineError::Build(BuildError::Compile(_))) |
| 684 | && preview_failed) |
| 685 | { |
| 686 | self.terminal.push(ConsoleStream::Error, err.to_string()); |
| 687 | } |
| 688 | } |
| 689 | } |
| 690 | } else if preview_failed { |
| 691 | self.status_message = Some("build failed".to_owned()); |
| 692 | } else if let Some(cache) = &self.stage_cache { |
| 693 | self.status_message = Some("built".to_owned()); |
| 694 | self.terminal.push( |
| 695 | ConsoleStream::Success, |
| 696 | build_summary(&cache.result, produced_layer), |
| 697 | ); |
| 698 | } else { |
| 699 | self.status_message = Some("build skipped".to_owned()); |
| 700 | self.terminal.push( |
| 701 | ConsoleStream::Warning, |
| 702 | "No build manifest was found for the active document.", |
| 703 | ); |
| 704 | } |
| 705 | if !has_config || failed { |
| 706 | self.push_build_diagnostics(failed); |
| 707 | } |
| 708 | self.build_glow_start = Some(now); |
| 709 | self.record_build_lit(produced_layer); |
| 710 | } |
| 711 | |
| 712 | fn push_build_diagnostics(&mut self, failed: bool) { |
| 713 | use full_stack::compilation_pipeline::DiagnosticLevel; |
| 714 | let Some(cache) = &self.stage_cache else { |
| 715 | return; |
| 716 | }; |