nb-fabric 0.4.2

CLI for managing Microsoft Fabric notebooks; create, edit cells, execute interactively, schedule, and query OneLake data
// #region Imports
use anyhow::Result;
use reqwest::Client;
use serde_json::json;

use crate::client;
use crate::notebook;
// #endregion

// #region Functions

/// Handle `nb create <workspace/name>` command.
/// Creates a new notebook with the specified kernel and optional lakehouse/warehouse bindings.
///
/// Inputs:
///   - reference: "workspace/notebook-name" format
///   - kernel: "python" or "pyspark"
///   - lakehouse: optional lakehouse display name to attach
///   - warehouse: optional warehouse display name to attach
pub async fn run_create(
    http: &Client,
    reference: &str,
    kernel: &str,
    lakehouse: Option<&str>,
    warehouse: Option<&str>,
) -> Result<()> {
    let (ws_name, nb_name) = client::parse_ref(reference)?;
    let ws_id = client::resolve_workspace(http, ws_name).await?;

    // Resolve lakehouse if specified
    let mut lh_id = None;
    let mut lh_name_resolved = None;
    if let Some(lh) = lakehouse {
        let item = client::resolve_item(http, &ws_id, lh, "Lakehouse").await?;
        lh_id = Some(item.id);
        lh_name_resolved = Some(item.display_name);
    }

    // Resolve warehouse if specified
    let mut wh_id = None;
    let mut wh_name_resolved = None;
    if let Some(wh) = warehouse {
        let item = client::resolve_item(http, &ws_id, wh, "Warehouse").await?;
        wh_id = Some(item.id);
        wh_name_resolved = Some(item.display_name);
    }

    let (_, encoded) = notebook::generate_ipynb(
        kernel,
        lh_id.as_deref(),
        lh_name_resolved.as_deref(),
        wh_id.as_deref(),
        wh_name_resolved.as_deref(),
        &ws_id,
    );

    let body = json!({
        "displayName": nb_name,
        "type": "Notebook",
        "definition": {
            "format": "ipynb",
            "parts": [
                {
                    "path": "notebook-content.ipynb",
                    "payload": encoded,
                    "payloadType": "InlineBase64"
                }
            ]
        }
    });

    let item = client::create_item(http, &ws_id, &body).await?;

    println!("  Created notebook");
    println!("  {}", "-".repeat(40));
    println!("  Name        {}", item.display_name);
    println!("  ID          {}", item.id);
    println!("  Workspace   {}", ws_id);
    println!("  Kernel      {}", kernel);

    if let Some(ref lh) = lh_name_resolved {
        println!("  Lakehouse   {}", lh);
    }
    if let Some(ref wh) = wh_name_resolved {
        println!("  Warehouse   {}", wh);
    }

    Ok(())
}

// #endregion