mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	feat(f_chansend): support Blob data argument
This commit is contained in:
		@@ -3217,8 +3217,8 @@ chansend({id}, {data})					*chansend()*
 | 
				
			|||||||
		written if the write succeeded, 0 otherwise.
 | 
							written if the write succeeded, 0 otherwise.
 | 
				
			||||||
		See |channel-bytes| for more information.
 | 
							See |channel-bytes| for more information.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		{data} may be a string, string convertible, or a list.  If
 | 
							{data} may be a string, string convertible, |Blob|, or a list.
 | 
				
			||||||
		{data} is a list, the items will be joined by newlines; any
 | 
							If {data} is a list, the items will be joined by newlines; any
 | 
				
			||||||
		newlines in an item will be sent as NUL. To send a final
 | 
							newlines in an item will be sent as NUL. To send a final
 | 
				
			||||||
		newline, include a final empty string. Example: >
 | 
							newline, include a final empty string. Example: >
 | 
				
			||||||
			:call chansend(id, ["abc", "123\n456", ""])
 | 
								:call chansend(id, ["abc", "123\n456", ""])
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -516,6 +516,7 @@ uint64_t channel_from_stdio(bool rpc, CallbackReader on_output,
 | 
				
			|||||||
/// @param data will be consumed
 | 
					/// @param data will be consumed
 | 
				
			||||||
size_t channel_send(uint64_t id, char *data, size_t len,
 | 
					size_t channel_send(uint64_t id, char *data, size_t len,
 | 
				
			||||||
                    bool data_owned, const char **error)
 | 
					                    bool data_owned, const char **error)
 | 
				
			||||||
 | 
					  FUNC_ATTR_NONNULL_ALL
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Channel *chan = find_channel(id);
 | 
					  Channel *chan = find_channel(id);
 | 
				
			||||||
  size_t written = 0;
 | 
					  size_t written = 0;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -972,7 +972,17 @@ static void f_chansend(typval_T *argvars, typval_T *rettv, FunPtr fptr)
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ptrdiff_t input_len = 0;
 | 
					  ptrdiff_t input_len = 0;
 | 
				
			||||||
  char *input = save_tv_as_string(&argvars[1], &input_len, false);
 | 
					  char *input = NULL;
 | 
				
			||||||
 | 
					  if (argvars[1].v_type == VAR_BLOB) {
 | 
				
			||||||
 | 
					    const blob_T *const b = argvars[1].vval.v_blob;
 | 
				
			||||||
 | 
					    input_len = tv_blob_len(b);
 | 
				
			||||||
 | 
					    if (input_len > 0) {
 | 
				
			||||||
 | 
					      input = xmemdup(b->bv_ga.ga_data, input_len);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    input = save_tv_as_string(&argvars[1], &input_len, false);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!input) {
 | 
					  if (!input) {
 | 
				
			||||||
    // Either the error has been handled by save_tv_as_string(),
 | 
					    // Either the error has been handled by save_tv_as_string(),
 | 
				
			||||||
    // or there is no input to send.
 | 
					    // or there is no input to send.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -89,6 +89,9 @@ describe('channels', function()
 | 
				
			|||||||
    command("call chansend(id, 'howdy')")
 | 
					    command("call chansend(id, 'howdy')")
 | 
				
			||||||
    eq({"notification", "stdout", {id, {"[1, ['howdy'], 'stdin']"}}}, next_msg())
 | 
					    eq({"notification", "stdout", {id, {"[1, ['howdy'], 'stdin']"}}}, next_msg())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    command("call chansend(id, 0z686f6c61)")
 | 
				
			||||||
 | 
					    eq({"notification", "stdout", {id, {"[1, ['hola'], 'stdin']"}}}, next_msg())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    command("call chanclose(id, 'stdin')")
 | 
					    command("call chanclose(id, 'stdin')")
 | 
				
			||||||
    expect_twostreams({{"notification", "stdout", {id, {"[1, [''], 'stdin']"}}},
 | 
					    expect_twostreams({{"notification", "stdout", {id, {"[1, [''], 'stdin']"}}},
 | 
				
			||||||
                       {'notification', 'stdout', {id, {''}}}},
 | 
					                       {'notification', 'stdout', {id, {''}}}},
 | 
				
			||||||
@@ -131,6 +134,8 @@ describe('channels', function()
 | 
				
			|||||||
    command("call chansend(id, 'TEXT\n')")
 | 
					    command("call chansend(id, 'TEXT\n')")
 | 
				
			||||||
    expect_twoline(id, "stdout", "TEXT\r", "[1, ['TEXT', ''], 'stdin']")
 | 
					    expect_twoline(id, "stdout", "TEXT\r", "[1, ['TEXT', ''], 'stdin']")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    command("call chansend(id, 0z426c6f6273210a)")
 | 
				
			||||||
 | 
					    expect_twoline(id, "stdout", "Blobs!\r", "[1, ['Blobs!', ''], 'stdin']")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    command("call chansend(id, 'neovan')")
 | 
					    command("call chansend(id, 'neovan')")
 | 
				
			||||||
    eq({"notification", "stdout", {id, {"neovan"}}}, next_msg())
 | 
					    eq({"notification", "stdout", {id, {"neovan"}}}, next_msg())
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user