I think the naming chapter of the api guidelines is what you are looking for, though it doesn't cover how you should name foo.
I wouldn't be too concerned about using map as part of the function name, because f(Self) -> Self is still a mapping.
There's one thing though that got me thinking recently, after reading this blog post by matklad: pushing ifs up. I'm not sure if I 100% agree that pushing ifs up is always a good idea, but it certainly applies to your example. Maybe in your case it would be better to move the if statement to the caller?
@H2CO3 convinced me not long ago that if there are two valid options, then there's no reason to pick only one, and this is one of those cases: I have an option where the caller can make the branch, and another where the method can make the branch.
The place where the second comes in handy is when using the Builder pattern [that chains ownership], and you want to allow the caller to make compact object initializations that may sometimes be conditional.
Basically this:
let bldr = Builder::new("something")
.attr("Hello", "World");
let bldr = if condition {
bldr.attr("Something", "else")
} else {
bldr
};
let obj = bldr.build();
.. can be expressed as:
let obj = Builder::new("something")
.attr("Hello", "World")
.attr_if(condition, "Something", "else")
.build();
(This is a very minimal example; the ones I actually work with become massive unwieldy hair-balls if I don't use the _if construct).