Add a command to Graphene CLI for listing protonode identifiers (#3399)

* Add proto node name printing

* Add subcommand for printing proto node identifiers

* Address review comments

* Cargo fmt
This commit is contained in:
Dennis Kobert 2025-11-19 11:59:27 +01:00 committed by GitHub
parent 06484ef4e0
commit f61aebb777
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 14 additions and 3 deletions

View File

@ -7,7 +7,7 @@ use graph_craft::proto::ProtoNetwork;
use graph_craft::util::load_network; use graph_craft::util::load_network;
use graph_craft::wasm_application_io::EditorPreferences; use graph_craft::wasm_application_io::EditorPreferences;
use graphene_std::application_io::{ApplicationIo, NodeGraphUpdateMessage, NodeGraphUpdateSender, RenderConfig}; use graphene_std::application_io::{ApplicationIo, NodeGraphUpdateMessage, NodeGraphUpdateSender, RenderConfig};
use graphene_std::text_nodes::FontCache; use graphene_std::text::FontCache;
use graphene_std::wasm_application_io::{WasmApplicationIo, WasmEditorApi}; use graphene_std::wasm_application_io::{WasmApplicationIo, WasmEditorApi};
use interpreted_executor::dynamic_executor::DynamicExecutor; use interpreted_executor::dynamic_executor::DynamicExecutor;
use interpreted_executor::util::wrap_network_in_scope; use interpreted_executor::util::wrap_network_in_scope;
@ -56,6 +56,7 @@ enum Command {
#[clap(long, short = 'l')] #[clap(long, short = 'l')]
run_loop: bool, run_loop: bool,
}, },
ListNodeIdentifiers,
} }
#[derive(Debug, Args)] #[derive(Debug, Args)]
@ -76,12 +77,20 @@ async fn main() -> Result<(), Box<dyn Error>> {
let document_path = match app.command { let document_path = match app.command {
Command::Compile { ref document, .. } => document, Command::Compile { ref document, .. } => document,
Command::Run { ref document, .. } => document, Command::Run { ref document, .. } => document,
Command::ListNodeIdentifiers => {
let mut ids: Vec<_> = graphene_std::registry::NODE_METADATA.lock().unwrap().keys().cloned().collect();
ids.sort_by_key(|x| x.name.clone());
for id in ids {
println!("{}", id.name)
}
return Ok(());
}
}; };
let document_string = std::fs::read_to_string(document_path).expect("Failed to read document"); let document_string = std::fs::read_to_string(document_path).expect("Failed to read document");
log::info!("creating gpu context",); log::info!("creating gpu context",);
let mut application_io = block_on(WasmApplicationIo::new()); let mut application_io = block_on(WasmApplicationIo::new_offscreen());
if let Command::Run { image: Some(ref image_path), .. } = app.command { if let Command::Run { image: Some(ref image_path), .. } = app.command {
application_io.resources.insert("null".to_string(), Arc::from(std::fs::read(image_path).expect("Failed to read image"))); application_io.resources.insert("null".to_string(), Arc::from(std::fs::read(image_path).expect("Failed to read image")));
@ -123,6 +132,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
tokio::time::sleep(std::time::Duration::from_millis(16)).await; tokio::time::sleep(std::time::Duration::from_millis(16)).await;
} }
} }
_ => unreachable!("All other commands should be handled before this match statement is run"),
} }
Ok(()) Ok(())
@ -168,7 +178,8 @@ fn fix_nodes(network: &mut NodeNetwork) {
// https://github.com/GraphiteEditor/Graphite/blob/d68f91ccca69e90e6d2df78d544d36cd1aaf348e/editor/src/messages/portfolio/portfolio_message_handler.rs#L535 // https://github.com/GraphiteEditor/Graphite/blob/d68f91ccca69e90e6d2df78d544d36cd1aaf348e/editor/src/messages/portfolio/portfolio_message_handler.rs#L535
// Since the CLI doesn't have the document node definitions, a less robust method of just patching the inputs is used. // Since the CLI doesn't have the document node definitions, a less robust method of just patching the inputs is used.
DocumentNodeImplementation::ProtoNode(proto_node_identifier) DocumentNodeImplementation::ProtoNode(proto_node_identifier)
if (proto_node_identifier.name.starts_with("core_types::ConstructLayerNode") || proto_node_identifier.name.starts_with("core_types::AddArtboardNode")) && node.inputs.len() < 3 => if (proto_node_identifier.name.starts_with("graphene_core::ConstructLayerNode") || proto_node_identifier.name.starts_with("graphene_core::AddArtboardNode"))
&& node.inputs.len() < 3 =>
{ {
node.inputs.push(NodeInput::Reflection(DocumentNodeMetadata::DocumentNodePath)); node.inputs.push(NodeInput::Reflection(DocumentNodeMetadata::DocumentNodePath));
} }